2017-05-27 16 views
0

プロジェクト要件のため、JSONデータを解析するためにcom.fasterxml.jackson.databindライブラリを使用する必要があります。他の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); 

ルートレベルのノード値を更新する。のJSONファイルの中でenvironment、いくつかの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:ネストされた配列ノードの値を更新する方法が見つかりませんでした。 questionListwhen is the next world cupからwhen is the next soccer world cup

答えて

5

ObjectMapperを使用すると、JSONを解析できます。pojoクラスを使用してJSONを解析して更新するのは非常に簡単です。

linkを使用してjsonをJavaクラスに変換するには、jsonをここでダウンロードクラス構造に貼り付けます。

ネストされた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); –

関連する問題