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");
}