【问题标题】:Need to update the value in a Json node需要更新 Json 节点中的值
【发布时间】:2021-09-26 18:25:10
【问题描述】:

我有一些任意的 Json,我想用对象替换一些文本字段。文本字段具有特定模式,例如,假设它们以美元符号 $ 开头。我事先不知道键是什么。

我要替换它的对象是 Pojo,可能是 Map 或 List,可以轻松序列化为 Json

例如

{
   "key1" : "some value",
   "key2" : "$replaceMe",
   "key3" : {
       "key4" : "more complex",
       "key5" : "$andMe"
}

所以替换后的对象会是这样的

{
   "key1" : "some value",
   "key2" : {},
   "key3" : {
       "key4" : "more complex",
       "key5" : {}
}

其中{} 表示替换先前存在的字符串的新对象

我想出了几种遍历树的方法,但想不出一个好的方法来跟踪要替换的对象以及如何替换它们。

【问题讨论】:

标签: json jackson


【解决方案1】:

您可以遍历 json 文件的 JsonNode 节点,检查每个父节点的子节点:您可以使用JsonNode#isTextual 方法检查是否有代表基本 JSON 字符串值的子节点,以及它们的文本是否以美元符号如下:

ObjectMapper mapper = new ObjectMapper();
//with a generic parent jsnode and one child node of it
if (child.isTextual() && child.asText().startsWith("$")) {
    //delete the old text value and create an empty objectnode
    ((ObjectNode)parent).set(fieldName, mapper.createObjectNode());
}

要创建一个空的ObjectNode 子级,您可以使用ObjectMapper#createObjectNode 方法,就像我在上面所做的那样。

【讨论】:

  • 谢谢,我的问题是没有意识到我必须通过父母。我可以遍历父母并随我改变结构吗?
  • @PeterKronenberg 欢迎您。是的,您可以在迭代时更改它,总是先存储父级,然后再更改子级。
  • 而且,所有你感兴趣的节点都是json树的叶子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2023-04-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多