JSON中带多余反斜杠?原来是滥用FastJSON造成的!

发布时间 2024-01-05 23:10:36作者: Ashe||^_^

以前对接很多老系统的接口是发现对方返回的JSON往往有些不太对劲,例如

{
    "key_1":"A",
    "key_2":"{\"name\":\"Tom\"}"
}

由于以前我使用springBoot自带的Jackson,因此从未自己造成这种现象,然而最近在对接一个接口时,我自己使用FastJSON时恰巧就复制了一模一样的bug:

我当时就是把一个解密出来的字符串str作为value,put到JSONObject中,最后返回的jsonObject.toJSONString()就多出反斜杠了,但是刚解密出来的str打印结果是不带反斜杠的。

最开始我甚至以为这是FastJSON的put方法内部给引号前加了反斜杠,还误以为是FastJSON的bug~~~

put的键值对,当value为字符串时,必然会携带反斜杠,因为"{"name":"Tome"}"这样的字符串在Java中是会报错的,因此虽然打印出来的是不带反斜杠的{"name":"Tome"},但其实际上字符串str本身是"{\"name\":\"Tom\"}"

最后自己写了如下测试类才恍然大悟,JSON中带多余反斜杠的原因是因为滥用FastJSON

@Getter
    @Setter
    public class Cat {

        private String name;

        @Override
        public String toString() {
            return "{" + "\"name\":\"" + name + "\"}";
        }
        
    }


    @Test
    void sth(){
        Assertions.assertDoesNotThrow(() -> {
            Cat cat = new Cat();
            cat.setName("Tom");
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("key_1", "A");
//            jsonObject.put("key_2", JSONObject.parseObject(cat.toString()));
            jsonObject.put("key_2", cat.toString());
            log.info("jsonObject {}", jsonObject.toJSONString());
        });
    }

总结:jsonObject.put("key", str);当str是一个JSON对象字符串时就不能将其作为String类型put进去,需要先将其转成JSONObject才是正确的做法jsonObject.put("key", JSONObject.parseObject(str));