2017-05-27 132 views
0

由于项目要求,我必须使用com.fasterxml.jackson.databind库来解析JSON数据不能使用其他可用的JSON库。的Java:在JSON文件嵌套数组节点的更新值

我是新来的JSON解析,所以不知道是否有更好的选择吗?

我想知道我可以在JSON文件中Array节点更新一个字符串值。

以下是JSON示例。请注意,这不是整个文件内容,而是一个简化版本。

{ 
    "call": "SimpleAnswer", 
    "environment": "prod", 
    "question": { 
    "assertions": [ 
     { 
     "assertionType": "regex", 
     "expectedString": "(.*)world cup(.*)" 
     } 
    ], 
    "questionVariations": [ 
     { 
     "questionList": [ 
      "when is the next world cup" 
     ] 
     } 
    ] 
    } 
} 

以下是将JSON读入java对象的代码。

byte[] jsonData = Files.readAllBytes(Paths.get(PATH_TO_JSON)); 
JsonNode jsonNodeFromFile = mapper.readValue(jsonData, JsonNode.class); 

要更新根级节点值例如environmentJSON文件,我发现以下方法在一些SO线程上。

ObjectNode objectNode = (ObjectNode)jsonNodeFromFile; 
objectNode.remove("environment"); 
objectNode.put("environment", "test"); 
jsonNodeFromFile = (JsonNode)objectNode; 
FileWriter file = new FileWriter(PATH_TO_JSON); 
file.write(jsonNodeFromFile.toString()); 
file.flush(); 
file.close(); 

问题1:这是更新JSON文件中值的唯一方法,它是最好的方式吗?我担心在这里进行双重铸造和文件I/O。

问题2:我无法找到一种方式来更新用于嵌套阵列节点例如值questionList。从更新的when is the next world cup问题when is the next soccer world cup

回答

5

您可以使用ObjectMapper来解析JSON,这是很容易解析和使用POJO类更新JSON。

使用link你的JSON转换成Java类,只需粘贴JSON这里N下载类结构。

您可以通过使用来访问或更新嵌套的json字段。 (点)运算符

ObjectMapper mapper = new ObjectMapper(); 
    String jsonString="{\"call\":\"SimpleAnswer\",\"environment\":\"prod\",\"question\":{\"assertions\":[{\"assertionType\":\"regex\",\"expectedString\":\"(.*)world cup(.*)\"}],\"questionVariations\":[{\"questionList\":[\"when is the next world cup\"]}]}}"; 
    TestClass sc=mapper.readValue(jsonString,TestClass.class); 

    // to update environment 
    sc.setEnvironment("new Environment"); 
    System.out.println(sc); 

    //to update assertionType 
    Question que=sc.getQuestion(); 
    List assertions=que.getAssertions(); 
    for (int i = 0; i < assertions.size(); i++) { 
     Assertion ass= (Assertion) assertions.get(i); 
     ass.setAssertionType("New Type"); 
    } 
+1

工作就像一个魅力。无需再处理JSON层次结构。我可以轻松地解析Java对象和文件中的数据,更新属性并将其写回到文件中。 (1)将数据读取到java对象:TestClass testClass = mapper.readValue(new File(FILE_FULL_PATH),TestClass.class); #2)更新Java对象为Pranay建议#3将对象写回到文件中:mapper.writeValue(new File(FILE_FULL_PATH),testClass); –