在 Jackson (jackson-databind) 库中尝试 ObjectNode
您可以从头开始构建它
val factory = JsonNodeFactory(true)
val o = ObjectNode(factory)
o.set("id", IntNode(15))
o.set("name", TextNode("yourname"))
o.set("lastName", TextNode("lastname"))
val address = ObjectNode(factory)
o.set("address", address)
address.set("streetName", TextNode("Lenin"))
address.set("streetNumber", IntNode(5))
address.set("buildingNumber", IntNode(15))
println(o)
或加载现有的 json 并对其进行修改
val json = "{\n" +
" \"id\": \"\",\n" +
" \"name\": \"\",\n" +
" \"age\": 0,\n" +
" \"address\": {\n" +
" \"streetName\": \"\",\n" +
" \"streetNumber\": 0\n" +
" }\n" +
"}"
val o : ObjectNode = (ObjectMapper()).readTree(json) as ObjectNode
o.set("id", IntNode(15))
o.set("name", TextNode("yourname"))
val address = o.get("address") as ObjectNode
address.set("streetName", TextNode("Lenin"))
address.set("streetNumber", IntNode(5))
address.set("buildingNumber", IntNode(15))
println(o)
我不知道在 Json 中支持多级路径的库。但是实现这样的东西相当容易:
fun setInJson(root: ObjectNode, objectMapper: ObjectMapper, path: String, value: JsonNode) {
val splitPath = path.split(":")
val lastName = splitPath.last()
val notLastNames = splitPath.subList(0, splitPath.size - 1)
var node = root
notLastNames.forEach { nodeName ->
node = (node.get(nodeName) as ObjectNode?) ?: {
val newNode = objectMapper.createObjectNode()
node.set(nodeName, newNode)
newNode
}()
}
node.set(lastName, value)
}
可以用作:
val json = "{\n" +
" \"id\": \"\",\n" +
" \"name\": \"\",\n" +
" \"age\": 0,\n" +
" \"address\": {\n" +
" \"streetName\": \"\",\n" +
" \"streetNumber\": 0\n" +
" }\n" +
"}"
val om = ObjectMapper()
val o : ObjectNode = (ObjectMapper()).readTree(json) as ObjectNode
setInJson(o, om, "id", IntNode(15))
setInJson(o, om, "name", TextNode("yourname"))
setInJson(o, om, "address:streetName", TextNode("Lenin"))
setInJson(o, om, "address:streetNumber", IntNode(5))
println(o)