serialization - 在 moshi 中使用自定义 MapAdapter 序列化地图
问题描述
我正在尝试MapAdapter
在moshi中编写自定义我的要求是忽略地图中的任何不良元素。我已经成功编写了反序列化方法(fromJson()
),但是,我遇到了toJson
. 这是我的toJson()
方法。
override fun toJson(writer: JsonWriter, value: Map<Any?, Any?>?) {
if (value == null) {
writer.nullValue()
} else {
writer.beginObject()
value.forEach {
writer.name(elementKeyAdapter.toJsonValue(it.key).toString())
.value(elementValueAdapter.toJson(it.value))
}
writer.endObject()
}
}
这段代码的问题在于它总是将 map 中的值作为最终 Json 中的字符串写入。例如考虑这个代码
enum class VehicleType2 {
@Json(name ="type1")
TYPE1,
@Json(name ="type2")
TYPE2,
@Json(name ="type3")
TYPE3,
@Json(name ="type4")
TYPE4,
}
和
val map = mutableMapOf<VehicleType2, Int>()
map[VehicleType2.TYPE1] = 1
map[VehicleType2.TYPE2] = 2
val adapter: JsonAdapter<Map<VehicleType2, Int>> =
moshi.adapter(Types.newParameterizedType(Map::class.java, VehicleType2::class.java, Integer::class.java))
Log.i("test", adapter.toJson(map))
这导致跟随 Json
{"type1":"1","type2":"2"}
注意 how1
和2
arestrings
和 not integers
。到目前为止,我已经尝试了很多排列,但都没有成功。
这是重现此问题的更完整示例。
解决方案
经过几次试验和错误后,我发现这工作正常
writer.name(elementKeyAdapter.toJsonValue(it.key).toString())
elementValueAdapter.toJson(writer, it.value)
代替
writer.name(elementKeyAdapter.toJsonValue(it.key).toString())
.value(elementValueAdapter.toJson(it.value))
我仍然不确定它背后的原因。谢谢!
推荐阅读
- reactjs - 如何在 react-native-share 中使 url 字符串可点击
- sql - 如何选择多个列,但仅显示唯一/非重复的结果(基于一个特定列)?
- javascript - 如何限制 chartIQ 库中的最小和最大缩放
- c - 如何在 C 中获取操作系统信息
- elasticsearch - 如何将 not_analyzed 应用于字段
- reactjs - 如何在带有 MDXJS 的 MDX / Markdown 文件中使用 i18next / react-i18next?
- ios - 如何在 Swift 中向响应式网站添加后退按钮
- javascript - 将多个对象数组转换为单个数组,同时合并公共键上的对象
- java - 仅具有队列通信和性能测试的春季应用程序
- oracle - PL/SQL: For 循环选择列表