[日常踩坑]--(7)不同jar包中JSONObject的区别

Author:赵志乾
Date:2019-08-29
Declaration:All Right Reserved!!!

踩坑

场景:HttpPost使用StringEntity配置请求体。

做法:使用json-lib包中的JSONObject设置参数,并通过JSONObject的toString方法获取的json串构建StringEntity。发送端实际发送数据和期望发送数据不一致。如下:

// 发送端数据构建
JSONObject jsonBody= new JSONObject();
jsonBody.put("sign", "541df7b19d38b575ec8001bb5e50a5fc");
jsonBody.put("data","{\"name\":\"baixiaoyuan\",\"age\":18,\"score\":100");
StringEntity entity = new StringEntity(jsonBody.toString(), "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
httpPost.setEntity(entity);


// 发送端要发送的数据
{"data":"{\"name\":\"baixiaoyuan\",\"age\":18,\"score\":100}","sign":"541df7b19d38b575ec8001bb5e50a5fc"}
// 发送端实际发送的数据
{"data":{"name":"baixiaoyuan","age":18,"score":100},"sign":"541df7b19d38b575ec8001bb5e50a5fc"}

解决方案

该问题产生的原因是json-lib包中JSONObject在put操作时,会对其放入的value值多做一层转化操作。源码如下:

public Object put(Object key, Object value) {
    if (key == null) {
        throw new IllegalArgumentException("key is null.");
    } else {
        Object previous = this.properties.get(key);
        // 看下面element的构建过程
        this.element(String.valueOf(key), value);
        return previous;
    }
}

// element构建过程,调用重载函数
public JSONObject element(String key, Object value) {
     return this.element(key, value, new JsonConfig());
}

// element构建过程的重载函数
public JSONObject element(String key, Object value, JsonConfig jsonConfig) {
    this.verifyIsNull();
    if (key == null) {
        throw new JSONException("Null key.");
    } else {
        if (value != null) {
            // 对value做了转换处理
            value = this.processValue(key, value, jsonConfig);
            this._setInternal(key, value, jsonConfig);
         } else {
            this.remove(key);
         }
         return this;
    }
}

// value的转换处理过程
private Object processValue(String key, Object value, JsonConfig jsonConfig) {
    if (value != null) {
       // 查找value的处理器
       JsonValueProcessor processor = jsonConfig.findJsonValueProcessor(value.getClass(), key);
       if (processor != null) {
          // 对value进行转换处理
          value = processor.processObjectValue((String)null, value, jsonConfig);
          if (!JsonVerifier.isValidJsonValue(value)) {
              throw new JSONException("Value is not a valid JSON value. " + value);
           }
        }
     }

     return this._processValue(value, jsonConfig);
}

方案:如果不希望JSONObject做隐含转换时,要使用fastjson包的JSONObject。两者对比如下:

// 测试代码
com.alibaba.fastjson.JSONObject jsonBody1 = new com.alibaba.fastjson.JSONObject();
jsonBody1.put("sign", "541df7b19d38b575ec8001bb5e50a5fc");
jsonBody1.put("data","{\"name\":\"baixiaoyuan\",\"age\":18,\"score\":100}");
System.out.println("---fastjson---");
System.out.println(jsonBody1.toString());
net.sf.json.JSONObject jsonBody2 = new net.sf.json.JSONObject();
jsonBody2.put("sign", "541df7b19d38b575ec8001bb5e50a5fc");
jsonBody2.put("data","{\"name\":\"baixiaoyuan\",\"age\":18,\"score\":100}");
System.out.println("---json-lib---");
System.out.println(jsonBody2.toString());


// 输出结果
---fastjson---
{"data":"{\"name\":\"baixiaoyuan\",\"age\":18,\"score\":100}","sign":"541df7b19d38b575ec8001bb5e50a5fc"}
---json-lib---
{"sign":"541df7b19d38b575ec8001bb5e50a5fc","data":{"name":"baixiaoyuan","age":18,"score":100}}

 

建议:使用新的api时,要多做几次试验,了解其特性,避免理解错误而踩坑
 

JSONObject必包的Jar包json生成的简单案例 所有commons包的网址: http://commons.apache.org/index.html 组装和解析JSONObjectJson字符串,共需要下面六个包: 1、json-lib 2、commons-beanutils 3、commons-collections 4、commons-lang 5、commons-logging 6、ezmorph 第零个包: json-lib-2.4-jdk15.jar http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/ 下载地址:http://nchc.dl.sourceforge.net/project/json-lib/json-lib/json-lib-2.4/json-lib-2.4-jdk15.jar 第一个包: commons-beanutils-1.9.2.jar http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi 下载地址:http://mirrors.cnnic.cn/apache//commons/beanutils/binaries/commons-beanutils-1.9.2-bin.zip 第二个包: (注:此包不可用,改用旧包) commons-collections4-4.0.jar http://commons.apache.org/proper/commons-collections/download_collections.cgi 下载地址:http://apache.dataguru.cn//commons/collections/binaries/commons-collections4-4.0-bin.zip (注:此包可用,低版本的包稳定性更高) commons-collections-3.2.1.jar http://commons.apache.org/proper/commons-collections/download_collections.cgi 下载地址:http://mirrors.hust.edu.cn/apache//commons/collections/binaries/commons-collections-3.2.1-bin.zip 第三个包: (注:此包不可用,会造成程序出错,改用旧包) commons-lang3-3.3.2.jar http://commons.apache.org/proper/commons-lang/download_lang.cgi 下载地址:http://apache.dataguru.cn//commons/lang/binaries/commons-lang3-3.3.2-bin.zip (注:此包可用,低版本的包稳定性更高) commons-lang-2.6-bin http://commons.apache.org/proper/commons-lang/download_lang.cgi?Preferred=http%3A%2F%2Fapache.dataguru.cn%2F 下载地址:http://apache.dataguru.cn//commons/lang/binaries/commons-lang-2.6-bin.zip 第四个包: commons-logging-1.1.3.jar http://commons.apache.org/proper/commons-logging/download_logging.cgi 下载地址:http://apache.dataguru.cn//commons/logging/binaries/commons-logging-1.1.3-bin.zip 第五个包: ezmorph-1.0.2.jar http://ezmorph.sourceforge.net/ http://sourceforge.net/projects/ezmorph/files/ezmorph/ 下载地址:http://nchc.dl.sourceforge.net/project/ezmorph/ezmorph/ezmorph-1.0.6/ezmorph-1.0.6.jar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫白小猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值