Java用字符串值替换JsonNode

时间:2019-04-13 03:24:46

标签: java jackson

我是Java的菜鸟,正在努力进行类型转换。我有一个如下的JSON对象:

   [  
       {  
        "A":{  
           "B":{  
              "C":"Message",
              "D":"FN1"
           }
        }
       }
    ] 

我想将其转换为:

  [  
       {  
        "A":{  
           "B": "My String Message"
        }
       }
    ]

我能够将旧的JSON节点替换为新的JSON节点,但无法将其替换为TextNode,尝试了如下所示的多个失败选项:

   JsonNode newNode = new TextNode("My String Message");
   ObjectNode nodeObj = (ObjectNode) jsonNode;
   nodeObj.removeAll();
   nodeObj.set(newNode);

1 个答案:

答案 0 :(得分:1)

您的代码只有一个小问题。添加新文本条目时,必须提供要与新文本节点关联的键值。所以这行:

nodeObj.set(newNode);

只需要这样:

nodeObj.set("B", newNode);

这是一个完整的示例,它可以按照您在问题中显示的内容进行操作,并结合了您提供的代码,并提供了一个小解决方案:

public static void main(String... args) throws IOException {

    // Read in the structure provided from a text file
    FileReader f = new FileReader("/tmp/foox.json");
    ObjectMapper mapper = new ObjectMapper();
    JsonNode rootNode = mapper.readTree(f);

    // Print the starting structure
    System.out.println(rootNode);

    // Get the node we want to operate on
    ObjectNode jsonNode = (ObjectNode)rootNode.get(0).get("A");

    // The OPs code, with just the small change of adding the key value when adding the new String
    JsonNode newNode = new TextNode("My String Message");
    ObjectNode nodeObj = (ObjectNode) jsonNode;
    nodeObj.removeAll();
    nodeObj.set("B", newNode);

    // Print the resulting structure
    System.out.println(rootNode);
}

以及结果输出:

[{"A":{"B":{"C":"Message","D":"FN1"}}}]
[{"A":{"B":"My String Message"}}]

更新:根据注释中的讨论,要进行更改,您必须访问与键A关联的ObjectNode。正是这个ObjectNode才将B与包含C和D的ObjectNode关联。要更改与B关联的值(您希望将其与TextNode而不是与ObjectNode关联),则需要访问与A关联的ObjectNode。如果您只有指向包含C和D的ObjectNode的指针,您无法进行想要的更改。