我需要将JSONObject转换为Map。
我注意到JSONObject有一个.toMap()方法...
出于好奇,我沉迷于对象本身,我注意到它具有一个私有成员映射,其中包含JSONObject的映射...
但是当我查看toMap()方法时,我看到他们实际上已经创建了一个新的Map实例并遍历整个JSONObject,而他们已经拥有一个私有成员了?
因此,他们在构造JSONObject时已经完成了工作,但是在调用toMap()时又会再次执行此工作吗?
为什么toMap()实现不是简单的
new HashMap(this.map);
?
从JSONObject源代码:
/**
* The map where the JSONObject's properties are kept.
*/
private final Map<String, Object> map;
私有成员几乎每个get方法都在质疑
/**
* Put a key/value pair in the JSONObject. If the value is null, then the
* key will be removed from the JSONObject if it is present.
*
* @param key
* A key string.
* @param value
* An object which is the value. It should be of one of these
* types: Boolean, Double, Integer, JSONArray, JSONObject, Long,
* String, or the JSONObject.NULL object.
* @return this.
* @throws JSONException
* If the value is non-finite number or if the key is null.
*/
public JSONObject put(String key, Object value) throws JSONException {
if (key == null) {
throw new NullPointerException("Null key.");
}
if (value != null) {
testValidity(value);
this.map.put(key, value);
} else {
this.remove(key);
}
return this;
}
在每个构造方法中都会调用put方法来填充私有地图成员
/**
* Returns a java.util.Map containing all of the entries in this object.
* If an entry in the object is a JSONArray or JSONObject it will also
* be converted.
* <p>
* Warning: This method assumes that the data structure is acyclical.
*
* @return a java.util.Map containing the entries of this object
*/
public Map<String, Object> toMap() {
Map<String, Object> results = new HashMap<String, Object>();
for (Entry<String, Object> entry : this.entrySet()) {
Object value;
if (entry.getValue() == null || NULL.equals(entry.getValue())) {
value = null;
} else if (entry.getValue() instanceof JSONObject) {
value = ((JSONObject) entry.getValue()).toMap();
} else if (entry.getValue() instanceof JSONArray) {
value = ((JSONArray) entry.getValue()).toList();
} else {
value = entry.getValue();
}
results.put(entry.getKey(), value);
}
return results;
}
toMap创建一个新的HashMap,并且文学作品重复构造器过程
我觉得他们只是不使用任何新实例...
我想念什么吗?
编辑:所以在阅读评论后,我可以接受新实例,因为我们不希望更改引用。
不过,为什么不执行那么简单呢
return new HashMap(this.map);
为什么要再次遍历JSONObject?
最佳答案
为什么toMap()实现不是简单的
新的HashMap(this.map);
因为那只是整个对象图的浅表副本,所以它仅包含复制的“当前”级别。
如果仔细观察,您会发现toMap
在每个子对象上调用toMap
,从而创建深层副本。
关于java - JSONObject.toMap()实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56652746/