问题描述:
在我的代码中,把body转成string放到HttpEntity里面然后去call第三方的接口。发现有些数据并没有传过去。所以check发现,fastjson默认开启了循环检查,一样的数据结构就折叠起来了。网上说是为了避免StackOverflowError,,,我选择不相信。。。这就是一个大坑啊。还有我把request的body也format成string存在日志表里面,也有这样的问题。
HttpEntity entity = new HttpEntity<>JSON.toJSONString(paramsMap), headers);
醉了,在源码的注释里面也没有说明一下这个问题,对于使用者来说,只会看到方法名来理解这个方法的功能,对于比较特殊的特性,应该要在注释里面说明至少。
复盘
我写了一个简单的demo
@Test
public void test1(){
List list = new ArrayList<>();
User user = new User();
user.setGender("man");
user.setId("1");
user.setName("Allen");
list.add(user);
list.add(user);
System.out.println(JSON.toJSONString(list));
}
结果:
[{"gender":"man","id":"1","name":"Allen"},{"$ref":"$[0]"}]
可以看到一样的data structure,就只是打印出了引用而已。要打印出完整的json需要关闭循环引用。
System.out.println(JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect));
再跑一次:
[{"gender":"man","id":"1","name":"Allen"},{"gender":"man","id":"1","name":"Allen"}]
这下就可以了。