的Java:在JSON文件嵌套数组节点的更新值
问题描述:
由于项目要求,我必须使用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);
要更新根级节点值例如environment
在JSON文件,我发现以下方法在一些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
答
您可以使用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");
}
工作就像一个魅力。无需再处理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); –