0

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

我是 JSON 解析的新手,所以不确定这里是否有更好的选择?

我想知道如何更新ArrayJSON 文件中节点中的字符串值。

以下是示例 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. 将问题从 更新when is the next world cupwhen is the next soccer world cup

4

1 回答 1

5

您可以使用ObjectMapper解析该 JSON,使用 pojo 类解析和更新 JSON 非常容易。

使用链接将您的 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");
    }
于 2017-05-27T06:04:07.683 回答