【发布时间】:2019-10-29 16:24:54
【问题描述】:
我正在使用com.fasterxml.jackson.databind.JsonNode java 库来解析JSON 并对JSON 字符串执行如下操作-
public static void main(String[] args) {
{
String jsonString = "{\"state\":{\"reported\":{\"deviceParams\":{\"deviceStatus\":{\"solenoid\":10,\"airFlow\":20}}}}}";
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = null;
try {
jsonNode = mapper.readTree(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
JsonNode subNode = jsonNode.get("state").get("reported").get("deviceParams").get("deviceStatus");
//Now subNode = {"solenoid":10,"airFlow":20}
modifySubNode((ObjectNode) subNode);
//type-casting JsonNode to ObjectNode since JSON manipulation like deletion and addition of nodes is only allowed in ObjectNode, not JsonNode
}
private static void modifySubNode(ObjectNode node) {
if (node.get("solenoid") != null) {
node.put("solenoid", 100);
}
}
在函数调用modifySubNode()之后,我预计jsonNode的值保持不变
{
"state":
{
"reported":
{
"deviceParams":
{
"deviceStatus":
{
"solenoid": 10,
"airFlow": 20
}
}
}
}
}
但是,它变成了这个
{
"state":
{
"reported":
{
"deviceParams":
{
"deviceStatus":
{
"solenoid": 100,
"airFlow": 20
}
}
}
}
}
为什么会这样?我认为对“子节点”的任何更改都不应该反映在“jsonNode”上。是不是我的理解有误?
【问题讨论】:
-
我更新了关于您评论的答案。
标签: java json pass-by-reference pass-by-value jsonnode