Kotlin Json 序列化3 - 添加map等类型支持

参考:

  1. https://github.com/yole/jkid
  2. https://github.com/cbeust/klaxon

通过测试,我们发现jkad不支持map属性的json序列化,为此我们将此功能添加上去;

1. List 与 Set 考虑

因为List与Set同属于 Collection的子类,所以,修改以下serializePropertyValue方法:
serializeList 重名为 serializeCollection,同时新增分支 serializeMap

private fun StringBuilder.serializePropertyValue(value: Any?) {
    when (value) {
        null -> append("null")
        is String -> serializeString(value)
        is Boolean, is Number -> append(value.toString())
        is Collection<*> -> serializeCollection(value)
        is Map<*,*> -> serializeMap(value)
        else -> serializeObj(value)
    }
}

2. 属性为Map的解析方法serializeMap

map 其实就是一个JsonObject,所以大括号括起来即可,新增方法如下:
对于Map中的key,json只能使用String类型的key,所以使用toString方法;

/**
 * Map 实际上是一个 Object
 */
private fun StringBuilder.serializeMap(data: Map<*, *>) {
    data.entries.joinToStringBuilder(this, separator = ", ", prefix = "{", postfix = "}") { it ->
        serializeString(it.key.toString())       // force to String
        append(":")
        serializePropertyValue(it.value as Any)
    }
}

2.1 测试Map类型属性

data class Person(val name: String, val age: Int) {
    val map = HashMap<String, Map<String, County>>()
    init {
        val county1 = County("湘潭", 20)
        val county2 = County("长沙", 100)
        val map1 = mapOf("JavaEE" to county1, "JavaSE" to county2)

        map["Java"] = map1
        map["Kotlin"] = map1
    }
}

class MyJsonToolsTest {
    @Test
    fun testMapToJson() {
        val person = Person("Alice", 29)
        val result = serialize(person)
        println(result)
    }
}

输出如下:

{
    "age": 29,
    "map": {
        "Java": {
            "JavaEE": {
                "name": "湘潭",
                "peopleCount": 20
            },
            "JavaSE": {
                "name": "长沙",
                "peopleCount": 100
            }
        },
        "Kotlin": {
            "JavaEE": {
                "name": "湘潭",
                "peopleCount": 20
            },
            "JavaSE": {
                "name": "长沙",
                "peopleCount": 100
            }
        }
    },
    "name": "Alice"
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,569评论 2 45
  • 经过30多个小时的颠簸,小真终于站在了大理苍山脚下一家名叫“捡人”的客栈门前。 这是一家规...
    佳佳的背包阅读 2,093评论 2 1
  • 2017.11.25号 星期 六 天气 晴 今晚到家后老公在家里准备菜,孩子问我:妈妈今天是什么日子?怎么...
    吕政民阅读 255评论 0 0
  • 每日下班,做菜是必不可少的一项。 雪小禅在《味道》里说:“一个城市的菜市场,最能体现一个城市的味道.....去菜市...
    LilyanSiena阅读 524评论 0 3