org.json源码分析及增强(二)——org.json.JSONException: Duplicate key问题处理

本文探讨了org.json.JSONException: Duplicate key问题的原因,源于JSONObject内部使用map不允许相同key。分析了原生JS如何处理重复key的JSON,会保留最后一个值。并提供了模仿JS处理方式的代码实现,包括修改JSONArray、JSONObject和JSONTokener类。

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属性的值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值