【问题标题】:JSON Behavior with .put() and .accumulate() retroactively changing values使用 .put() 和 .accumulate() 追溯更改值的 JSON 行为
【发布时间】:2019-08-01 20:54:26
【问题描述】:

在尝试将多个对象累积到 JSONObject 中时,我遇到了一个相当奇怪的交互。

我使用的是json-20180813.jar导入库

见下方代码

    import org.json.JSONObject;

    JSONObject masterobject = new JSONObject();
    JSONObject testobject = new JSONObject();

    testobject.put("Key1","Value1");
    testobject.put("Key2","Value2");
    masterobject.accumulate("masterkey1",testobject);
    System.out.println(masterobject.toString(1));
    System.out.println("~~~~~~~~~~~~~~~~~");

    testobject.put("Key1","Value3");
    System.out.println(masterobject.toString(1));

预期的输出是这样的:

主键 {value2 value1}

不是主键 {value2 value3}

相反,我最终得到了这个

{"masterkey1": {
 "Key2": "Value2",
 "Key1": "Value1"
}}
~~~~~~~~~~~~~~~~~
{"masterkey1": {
 "Key2": "Value2",
 "Key1": "Value3"
}}

我的问题是,为什么 .put() 对 masterkey 有影响?

注意:如果我要使用第二个 new JSONObject() 并累积该对象,则此问题已解决,但是我想了解为什么 .put() 编辑另一个对象。

【问题讨论】:

    标签: java json put accumulate


    【解决方案1】:

    问题在于.put() 正在修改存储在masterkey1 键下的对象。

    由于在 Java 中一切都使用指针而不是值来表示,所以当您修改 testobject 时,您也会看到 ma​​sterobject

    的变化

    【讨论】:

    • 对于使用 .put() 的 hashmap 是否也一样?所以masterobject尽管调用了accumulate,(在某些情况下最终被放置)并没有起到追加的作用,而是将指针“放置”到不可变对象中? JSONObjects 在文档中是不可变的,我是否误解了指针在不可变对象中的工作方式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2023-03-19
    • 1970-01-01
    • 2017-01-30
    相关资源
    最近更新 更多