Java:JSON文件中嵌套数组节点的更新值

Java:JSON文件中嵌套数组节点的更新值,java,arrays,json,jackson,jackson-databind,Java,Arrays,Json,Jackson,Jackson Databind,由于项目要求,我必须使用com.fasterxml.jackson.databind库解析JSON数据,无法使用其他可用的JSON库 我不熟悉JSON解析,所以不确定这里是否有更好的选项 我想知道如何更新JSON文件中数组节点中的字符串值 下面是一个JSON示例。请注意,这不是整个文件的内容,它是一个简化版本 { "call": "SimpleAnswer", "environment": "prod", "question": { "assertions": [

由于项目要求,我必须使用
com.fasterxml.jackson.databind
库解析JSON数据,无法使用其他可用的JSON库

我不熟悉JSON解析,所以不确定这里是否有更好的选项

我想知道如何更新JSON文件中
数组
节点中的字符串值

下面是一个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:我找不到更新嵌套数组节点值的方法,例如
questionList
。将问题从
下一届世界杯是什么时候
更新为
下一届足球世界杯是什么时候
您可以使用
ObjectMapper
解析该JSON,使用pojo类解析和更新JSON非常容易

用于将json转换为java类,只需将json粘贴到此处即可下载类结构

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

ObjectMapper mapper=new ObjectMapper();
String jsonString=“{\'call\':\'SimpleAnswer\',\'environment\':\'prod\',\'question\':{\'assertionType\':[{\'assertionType\':\'regex\',\'expectedString\':\'(.*)世界杯(..*),\'questionVariations\':[{\'questionList\':[\'下一届世界杯是什么时候?]}];
TestClass sc=mapper.readValue(jsonString,TestClass.class);
//更新环境
sc.setEnvironment(“新环境”);
系统输出打印LN(sc);
//更新断言类型
Question que=sc.getQuestion();
List assertions=que.getAssertions();
for(inti=0;i
您可以使用
ObjectMapper
解析该JSON,使用pojo类解析和更新JSON非常容易

用于将json转换为java类,只需将json粘贴到此处即可下载类结构

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

ObjectMapper mapper=new ObjectMapper();
String jsonString=“{\'call\':\'SimpleAnswer\',\'environment\':\'prod\',\'question\':{\'assertionType\':[{\'assertionType\':\'regex\',\'expectedString\':\'(.*)世界杯(..*),\'questionVariations\':[{\'questionList\':[\'下一届世界杯是什么时候?]}];
TestClass sc=mapper.readValue(jsonString,TestClass.class);
//更新环境
sc.setEnvironment(“新环境”);
系统输出打印LN(sc);
//更新断言类型
Question que=sc.getQuestion();
List assertions=que.getAssertions();
for(inti=0;i
工作起来很有魅力。不再需要处理JSON层次结构。我可以轻松地解析java对象和文件之间的数据,更新属性并将其写回文件#1) 将数据读取到java对象:TestClass TestClass=mapper.readValue(新文件(文件完整路径),TestClass.class)#2) 按照Pranay的建议更新java对象#3将对象写回文件:mapper.writeValue(新文件(文件完整路径),testClass);工作得很有魅力。不再需要处理JSON层次结构。我可以轻松地解析java对象和文件之间的数据,更新属性并将其写回文件#1) 将数据读取到java对象:TestClass TestClass=mapper.readValue(新文件(文件完整路径),TestClass.class)#2) 按照Pranay的建议更新java对象#3将对象写回文件:mapper.writeValue(新文件(文件完整路径),testClass);
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");
    }