fastjson:物件轉化成json出現$ref
Fastjson:Maven依賴
<!-- FASTJSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.20</version>
</dependency>
問題現象:$ref
package json;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
/**
* fastjson中$ref物件重複引用問題
*/
public class TestFastJson {
List<Person> list = new ArrayList<Person>();
Person p = new Person("FLY", 25);
/**
* 測試main
*/
public static void main(String[] args) {
new TestFastJson().test1();
}
/**
* 未關閉引用檢測,轉化字串時會出現$ref
*/
public void test1() {
list.add(p);
list.add(p);
String jsonStr = JSON.toJSONString(list);
System.out.println(jsonStr);
// [{"age":25,"name":"FLY"},{"$ref":"$[0]"}]
}
}
class Person {
private String name;
private int age;
// 建構函式
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
問題分析:$ref
- 實體轉化為json字串後出現了$ref字樣的東西,這是因為在傳輸的資料中出現相同的物件時,fastjson預設開啟引用檢測將相同的物件寫成引用的形式
-
引用是通過"$ref"來表示的
引用 描述 "$ref":".." 上一級 "$ref":"@" 當前物件,也就是自引用 "$ref":"$" 根物件 "$ref":"$.children.0" 基於路徑的引用,相當於 root.getChildren().get(0) - 說到引用分為兩種,重複引用和迴圈引用
重複引用
- 指一個物件重複出現多次
迴圈引用
- 指你心裡有我,我心裡有你(互相引用),這個問題比較嚴重,如果處理不好就會出現StackOverflowError異常
問題解決:$ref
重複引用的解決方法;
1.單個關閉 JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
2.全域性配置關閉 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
迴圈引用的解決方法:
1.如果你前端用不到這個屬性在該屬性的get方法上加上註解@JSONField(serialize=false),
這樣該屬性就不會被序列化出來,這個也可以解決重複引用
2.修改表結構,出現迴圈引用了就是一個很失敗的結構了,不然準備迎接StackOverflowError異常。
- 文章開頭,示例中的問題,就可以這樣解決
/**
* 關閉引用檢測後,$ref的問題就會被解決
*/
public void test2() {
list.add(p);
list.add(p);
String jsonStr = JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
System.out.println(jsonStr);
// [{"age":25,"name":"FLY"},{"age":25,"name":"FLY"}]
}
相關文章
- fastjson字串轉JSON的$ref問題ASTJSON字串
- fastjson: json物件,json物件陣列,javabean物件,json字串之間的相互轉化ASTJSON物件陣列JavaBean字串
- Java中使用Fastjson將JSON檔案轉物件JavaASTJSON物件
- jquery物件如何轉化成DOM物件jQuery物件
- 記錄下最近開發中fastjson的坑-fastjson出現json解析異常ASTJSON
- json資料出現{“$ref:”$[0]},無法得到所有資料JSON
- 【FastJSON】解決FastJson中“$ref 迴圈引用”的問題ASTJSON
- FastJson、Jackson、Gson進行Java物件轉換Json的細節處理ASTJSONJava物件
- fastjson 物件字串互轉方法例項ASTJSON物件字串
- JS json字串轉物件、物件轉字串JSON字串物件
- JSON 之FastJson解析JSONAST
- fastJson和jackson轉json的區別ASTJSON
- 使用@ResponseBody物件轉json和@RequestBody進行json轉物件案例物件JSON
- Android中實現JSON字串和JSON物件的轉換AndroidJSON字串物件
- FastJson--阿里巴巴公司開源的速度最快的Json和物件轉換工具ASTJSON阿里物件
- Json物件與Json字串互轉JSON物件字串
- js物件轉json字串物件JSON字串
- webwork 中 external-ref 和interceptor-ref 共同用出現問題Web
- js jquery 列印物件;json 物件轉字串jQuery物件JSON字串
- js把json字串轉成json物件JSON字串物件
- jquery實現將字串轉換為json格式物件jQuery字串JSON物件
- python中json物件轉換出錯解決方法PythonJSON物件
- JSON 之FastJson遠端解析JSONAST
- fastJson在java後臺轉換json格式資料探究ASTJSONJava
- JSON學習--com.alibaba.fastjson.JSONJSONAST
- fastjson 返回json字串,JSON.parse 報錯ASTJSON字串
- JSON.NET框架實現C#物件和JSON字串的轉換JSON框架C#物件字串
- eval() JSON轉換為物件JSON物件
- json字串和json格式物件的轉換JSON字串物件
- 生成JSON資料--fastjson(阿里)方法JSONAST阿里
- java實現將資料庫資料轉化成excel表格顯示出來Java資料庫Excel
- 將json格式物件轉換成陣列物件JSON物件陣列
- java物件與json物件間的相互轉換Java物件JSON
- json字串與物件互相轉換JSON字串物件
- JS實現JSON物件與URL引數的相互轉換JSON物件
- fastjson轉換json時,碰到的那些首字母大小寫轉換的坑!ASTJSON
- php陣列轉換為json,json又轉化為php物件。PHP陣列JSON物件
- C#實體物件序列化成Json,並讓欄位的首字母小寫C#物件JSON