org.json.JSONException: Duplicate key问题的出现
当使用JSONObject处理如json{\"key\" : 1,\"key\" : 2}"
这样的JSON数据格式的字符串时,或使用JSONArray处理json[{\"key\" : 1,\"key\" : 2}, {\"key\" : 3,\"key\" : 4}]
的数组字符串时,org.json.JSONException: Duplicate key的问题就出现了,原因首先是JSON数据格式不规范,本就不应该包含相同的key名,另外,JSONObject内部使用的是一个map数据结构,是不允许有同样的key存在的,因此,通过抛出JSONException异常来警告使用者。主要的源码如下:
public JSONObject putOnce(String key, Object value) throws JSONException {
if (key != null && value != null) {
if (this.opt(key) != null) {
throw new JSONException("Duplicate key \"" + key + "\"");
}
this.put(key, value);
}
return this;
}
通过this.opt(key) != null
来进行重复key的判断,但原生JS对于重复key的JSON串的处理过程是什么样子的呢?
还原原生JS的处理
我们通过浏览器的控制台写一段JS进行测试:
var data = "[{\"key\" : 1,\"key\" : 2}, {\"key\" : 3,\"key\" : 4}]";
eval("("+data+")");
运行结果如下:
可以看到JS的处理是会保留最后一对重复key的值作为key属性的值。