JSON中带多余反斜杠?原来是滥用FastJSON造成的!
以前对接很多老系统的接口是发现对方返回的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为JSON对象字符串时,必然会携带反斜杠,因为"{"name":"Tom"}"这样的字符串在Java中是会报错的,虽然打印str是不带反斜杠的{"name":"Tom"},但其实际上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));
。