最近在使用 fastjson 将 List 转为 json 字符串时发现转换出的字符串和预期不一样,出现了 “
r
e
f
”
:
”
ref”:”
ref“:“[0]” 这样的东西。
一、问题复现代码
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainServer {
public static void main(String[] args) {
HashMap<String, String> map1 = new HashMap<>();
map1.put("a", "a");
map1.put("b", "b");
map1.put("c", "c");
HashMap<String, String> map2 = new HashMap<>();
map2.put("a", "a");
map2.put("b", "b");
map2.put("c", "c");
List<HashMap<String, String>> list1 = new ArrayList<>();
list1.add(map1);
list1.add(map2);
List<HashMap<String, String>> list2 = new ArrayList<>();
list2.add(map1);
list2.add(map1);
System.out.println("list放入两个不同对象:");
System.out.println(JSON.toJSONString(list1));
System.out.println("list放入两个相同对象:");
System.out.println(JSON.toJSONString(list2));
}
}
输出:
list放入两个不同对象:
[{"a":"a","b":"b","c":"c"},{"a":"a","b":"b","c":"c"}]
list放入两个相同对象:
[{"a":"a","b":"b","c":"c"},{"$ref":"$[0]"}]
二、问题出现的原因
出现 $ref 这样的东西是因为在数据中出现了相同的对象, fastjson默认开启引用检测,将相同的对象写成引用的形式。
比如,上面代码中而 list2 里添加了两个一样的 map1。
三、解决
禁用FastJson的循环引用检测特性。
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainServer {
public static void main(String[] args) {
HashMap<String, String> map1 = new HashMap<>();
map1.put("a", "a");
map1.put("b", "b");
map1.put("c", "c");
HashMap<String, String> map2 = new HashMap<>();
map2.put("a", "a");
map2.put("b", "b");
map2.put("c", "c");
List<HashMap<String, String>> list1 = new ArrayList<>();
list1.add(map1);
list1.add(map2);
List<HashMap<String, String>> list2 = new ArrayList<>();
list2.add(map1);
list2.add(map1);
System.out.println("list放入两个不同对象:");
System.out.println(JSON.toJSONString(list1));
System.out.println("list放入两个相同对象:");
System.out.println(JSON.toJSONString(list2, SerializerFeature.DisableCircularReferenceDetect));
}
}
输出:
list放入两个不同对象:
[{"a":"a","b":"b","c":"c"},{"a":"a","b":"b","c":"c"}]
list放入两个相同对象:
[{"a":"a","b":"b","c":"c"},{"a":"a","b":"b","c":"c"}]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/80241.html