我有一个用于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>
适配器
发布于 2018-07-26 23:13:34
toJson
函数需要对参数使用@JvmSuppressWildcards
。
@ToJson fun toJson(@HexString byteStrings: List<@JvmSuppressWildcards ByteString>): List<String> {
return byteStrings.map { it.hex() }
}
如果没有它,Moshi就会看到List<? extends ByteString>
,并且无法匹配类型来查找适配器。
https://stackoverflow.com/questions/51548692
复制