2017-05-27 86 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); –