首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将局部变量值传递给方法后发生变化

将局部变量值传递给方法后发生变化
EN

Stack Overflow用户
提问于 2019-06-15 07:13:16
回答 1查看 501关注 0票数 0

我使用com.fasterxml.jackson.databind.JsonNode java库解析JSON并对JSON字符串执行以下操作:

代码语言:javascript
复制
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的值保持为

代码语言:javascript
复制
{
  "state":
  {
    "reported":
    {
      "deviceParams":
      {
        "deviceStatus":
        {
          "solenoid": 10,
          "airFlow": 20
        }
      }
    }
  }
}

但相反,它变成了

代码语言:javascript
复制
{
  "state":
  {
    "reported":
    {
      "deviceParams":
      {
        "deviceStatus":
        {
          "solenoid": 100,
          "airFlow": 20
        }
      }
    }
  }
}

为什么会发生这种事?我认为对"subNode“的任何修改都不应该反映"jsonNode”。我有误解吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-15 07:37:22

在此:

代码语言:javascript
复制
jsonNode = mapper.readTree(deviceShadow);

这将在内存中创建JSON数据的表示。仅仅是反映JSON字符串的结构和内容的某种数据结构。

这里:

代码语言:javascript
复制
JsonNode subNode = jsonNode.get(...

然后遍历该内存结构并识别其子结构.然后修改,即子结构:

代码语言:javascript
复制
node.put("solenoid", 100);

毫不奇怪:当您修改内存中的数据结构时,您将修改您的数据!

换句话说,你的假设是完全错误的。假设您有一些标准的Java实现,它有许多节点。现在,您可以在该树中标识特定的Node对象,并更改该节点的值。当然,这也改变了树的内容,因为节点位于中!

长话短说:你把数据读入内存,你特别针对数据的某一部分,你改变了数据,数据被改变了。这就是一切!

最后,我们讨论的是底层JSON库的语义。你在这里使用的图书馆。当您请求一个子节点时,根本不复制或克隆数据。它只会给你一个指向数据的“指针”。其他库可能会采取不同的做法,例如,可以想象所有数据都是只读的,修改是通过返回一个与初始数据分离的全新Node对象来完成的。

为了不更改初始的jsonNode对象,唯一的选择似乎是解析数据两次。因此,通过两次处理您的输入来创建完全独立的JsonNode。这当然是代码所做工作量的两倍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56608213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档