记录下自己遇到的问题↓ (想看结论,直接看最后就行)
当业务需要在拿到一个JSONObject对象之后,在该对象的一个子对象中设置一个键值对,来改变这个子对象的值。
JSONObject designInfo;
...designInfo里面的数据怎么来的,这块省略....
---其中有个子对象,子对象有个字段为“number”,值为0---
JSONObject designParam= designInfo.getJSONObject("designParam");
designParam.put("number", 7);
然后将这个数据作为结果返回,发现 designInfo 对象里面的 number 字段的值并没有变,还是0.
但是 designParam 里面的 number 变为 7
后来没多想,直接重新覆盖全部的值:
JSONObject designParam= designInfo.getJSONObject("designParam");
designParam.put("number", 7);
designInfo.put("designParam", designParam);
结果是没有问题, designInfo 对象里面的 number 字段的值变为 7.
后来看了一下get方法的源码 发现:
if (value instanceof Map) {
JSONObject object = new JSONObject((Map) value);
put(key, object);
return object;
}
如果在你操作对象里的 子对象是一个 类型为Map(或者在存值的时候,存的是一个对象),那么在执行“.getJSONObject”操作时 就会(new)新建一个对象。改变值之后 改变的是新对象 而不是原来的对象,从而导致值不变。下面示例:
//designRequest 是一个java对象
JSONObject json = new JSONObject();
json.put(DESIGN_REQUEST, designRequest);
总结下:
如果出现这种情况,有很大可能是值传递的问题。因为生成了新的对象,源对象就不会变。
一:存的时候,将对象变为 JSONObject:
//designRequest是一个对象
json.put(DESIGN_REQUEST, JSONObject.from(designRequest));
二:跟我上面一样,直接put覆盖下原值就行:
designInfo.put("designParam", designParam);