首页 > 解决方案 > 在 moshi 中使用自定义 MapAdapter 序列化地图

问题描述

我正在尝试MapAdaptermoshi中编写自定义我的要求是忽略地图中的任何不良元素。我已经成功编写了反序列化方法(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"}

注意 how12arestrings和 not integers。到目前为止,我已经尝试了很多排列,但都没有成功。

这是重现此问题的更完整示例。

标签: serializationkotlinandroid-jsonjsonserializermoshi

解决方案


经过几次试验和错误后,我发现这工作正常

                    writer.name(elementKeyAdapter.toJsonValue(it.key).toString())
                    elementValueAdapter.toJson(writer, it.value)

代替

writer.name(elementKeyAdapter.toJsonValue(it.key).toString())
                        .value(elementValueAdapter.toJson(it.value))

我仍然不确定它背后的原因。谢谢!


推荐阅读