java - Moshi 找不到我用 Kotlin 为参数化类型编写的自定义适配器

标签 java json kotlin moshi

我有一个用于 Moshi 的自定义 JSON 适配器,用于字节字符串列表,如下所示。

@Retention(RUNTIME)
@JsonQualifier
annotation class HexString

object ByteStringListAdapter {
  @ToJson fun toJson(@HexString byteStrings: List<@JvmSuppressWildcards ByteString>): List<String> {
    return byteStrings.map { it.hex() }
  }

  @FromJson @HexString fun fromJson(json: List<String>): List<@JvmSuppressWildcards ByteString> {
    return json.map { ByteString.decodeHex(it) }
  }
}

fun main(args: Array<String>) {
  val moshi = Moshi.Builder()
      .add(ByteStringListAdapter)
      .build()
  val byteStringListAdapter = moshi.adapter<List<ByteString>>(
      Types.newParameterizedType(List::class.java, ByteString::class.java), HexString::class.java)
}

即使我已经在 main 中正确注册了它在这里,运行该程序将失败并显示 java.lang.IllegalArgumentException: No @ToJson adapter for java.util.List<okio.ByteString> annotated [@HexString()] .

为什么 Moshi 找不到我为 @HexString List<ByteString> 注册的适配器?

最佳答案

toJson功能需求 @JvmSuppressWildcards 在参数上。

@ToJson fun toJson(@HexString byteStrings: List<@JvmSuppressWildcards ByteString>): List<String> {
  return byteStrings.map { it.hex() }
}

没有它,Moshi 会看到 List<? extends ByteString>无法匹配类型以找到适配器。

关于java - Moshi 找不到我用 Kotlin 为参数化类型编写的自定义适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51548692/

相关文章:

javascript - 在 React 组件的属性中插入 JSON?

javascript - 当我 JSON.stringify(object) 我得到一个疯狂的字符串作为值

android - 如何在 Android Studio 中配置 Kotlin 的自动完成设置?

java - 请问appfuse有什么问题吗

java - 为什么 "Local System"帐户缺少对 NTFS 文件系统的权限(将 java 作为 windows 服务运行)

java - 在gwt中调整布局面板的大小

Java 正则表达式不匹配(俄语)

android - 如何从 android studio 应用程序将 json 发送到 asp.net api Controller ?

java - 是否可以在 Mersenne Twister RNG (Java) 中指定 nextInt 的上限和下限

java - 如何在Spring中从文件读取参数到Schedule注释?