我需要将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/

10-12 02:38