【发布时间】:2019-08-20 09:01:19
【问题描述】:
我一直在玩 Kotlinx.serialisation。我一直在尝试找到一种快速的方法来使用 Kotlinx.serialisation 来创建一个简单的 JSON(主要是发送它),同时尽量减少代码混乱。
对于一个简单的字符串如:
{"Album": "Foxtrot", "Year": 1972}
我一直在做的事情是这样的:
val str:String = Json.stringify(mapOf(
"Album" to JsonPrimitive("Foxtrot"),
"Year" to JsonPrimitive(1972)))
这远非美好。我的元素大多是原始的,所以我希望我有类似的东西:
val str:String = Json.stringify(mapOf(
"Album" to "Sergeant Pepper",
"Year" to 1967))
此外,我很高兴有一个嵌套 JSON 的解决方案。比如:
Json.stringify(JsonObject("Movies", JsonArray(
JsonObject("Name" to "Johnny English 3", "Rate" to 8),
JsonObject("Name" to "Grease", "Rate" to 1))))
这会产生:
{
"Movies": [
{
"Name":"Johnny English 3",
"Rate":8
},
{
"Name":"Grease",
"Rate":1
}
]
}
(不一定要美化,最好不要)
有类似的吗?
注意:使用序列化器很重要,而不是直接字符串,例如
"""{"Name":$name, "Val": $year}"""
因为连接字符串是不安全的。任何非法字符都可能分解 JSON!我不想处理转义非法字符:-(
谢谢
【问题讨论】:
-
什么是“流氓字符”,在使用所需方法时如何防止它们?
-
我的意思是,像 " 或 } 之类的字符或 JSON 中非法的字符。我只是不想处理转义和非法字符的所有繁琐大惊小怪。无论如何,谢谢,我会做它更清晰。
-
是否需要 Kotlinx.serialization?我发现数据类 + gson 或 jackson 工作得非常好。我不确定这种方法是否能够针对 JVM 以外的东西。我也会像上面在 spring 控制器中显示的那样使用 mapOf 和 listOf,效果很好。
-
是的,如果您只想序列化随机映射、列表和数据类,我建议您查看 gson。需要注意的一件事是数据类的默认值,比如 Kotlinx.serialization 可以处理。我上次检查时,Gson 和 Jackson 没有考虑到这一点。
-
没有真正的理由使用 Kotlinx.serialisation。刚刚搜索了一个使用 Kotlin 数据类和 gradle 插件自然运行的库。我必须说,Kotlinx.serialisation 很可爱。它只适用于 Kotlin 及其类型。 Android Studio/Idea 可以很好地自动完成事情……总的来说很喜欢。
标签: json kotlin kotlinx.serialization