一、 簡介
Fastjson是一個Java語言編寫的高性能功能完善的JSON庫。它主要面向Java開發領域,能夠將Java對象序列化為JSON對象,同時也能將JSON對象反序列化為Java對象。它的速度比其他JSON庫更快,而且十分輕量級。Fastjson的功能非常強大,它為使用者提供了非常多的API,可以隨心所欲地進行序列化和反序列化操作,滿足了各種需求。以下是fastjson的一些常見功能和實現方法。
二、 序列化與反序列化
fastjson支持將Java對象直接序列化為JSON字符串,同時也可以把JSON字符串反序列化為Java對象。下面就以一個簡單的POJO對象為例,在Java代碼中,使用fastjson進行對象轉JSON格式操作,並且把轉換後的字符串再轉回對象。
public class Person { private String name; private int age; // getter、setter、toString方法省略 } Person person = new Person(); person.setName("Tom"); person.setAge(20); // 將Java對象轉換為JSON字符串 String jsonStr = JSON.toJSONString(person); System.out.println(jsonStr); // 將JSON字符串轉換為Java對象 Person person2 = JSON.parseObject(jsonStr, Person.class); System.out.println(person2.getName() + " " + person2.getAge());
上述代碼中,我們定義了一個簡單的Java對象Person,並給它設置了name和age屬性的值,接着將該對象轉換為JSON格式的字符串,並將該字符串再次轉換為Java對象,在轉換時使用了parseObject()方法,這個方法會返回Person類的一個實例。這樣我們就實現了Java對象和JSON字符串的相互轉換。
三、 高級序列化選項
fastjson還支持更高級別的序列化控制,例如在序列化時打印出null值、保留小數點後幾位等等。下面是一些高級序列化選項的例子:
// 打印null值的屬性 Person person = new Person(); person.setName(null); String jsonStr = JSON.toJSONString(person, SerializerFeature.WriteMapNullValue); System.out.println(jsonStr); // 保留小數點後兩位 double pi = 3.1415926; String str = JSON.toJSONString(pi, SerializerFeature.BrowserCompatible); System.out.println(str);
上述代碼中,我們使用了SerializerFeature枚舉類的一些常量來設置序列化選項,例如WriteMapNullValue常量表示序列化時輸出null值的屬性,BrowserCompatible常量表示保留小數點後兩位。
四、 JSON格式化輸出
fastjson不僅可以進行Java對象和JSON字符串之間的轉換,還可以將JSON字符串進行格式化輸出,使得輸出結果更加美觀易讀。下面是一個JSON字符串的例子:
{"name":"Tom","age":20,"books":["Java從入門到精通","數據結構與算法"],"hobbies":[{"name":"basketball","level":"high"},{"name":"ping-pong","level":"middle"}]}
使用fastjson提供的功能可以把該JSON字符串輸出為下面格式的形式:
{ "name": "Tom", "age": 20, "books": [ "Java從入門到精通", "數據結構與算法" ], "hobbies": [ { "name": "basketball", "level": "high" }, { "name": "ping-pong", "level": "middle" } ] }
下面是輸出格式化的代碼:
String jsonStr = "{\"name\":\"Tom\",\"age\":20,\"books\":[\"Java從入門到精通\",\"數據結構與算法\"],\"hobbies\":[{\"name\":\"basketball\",\"level\":\"high\"},{\"name\":\"ping-pong\",\"level\":\"middle\"}]}"; Object jsonObject = new JSONTokener(jsonStr).nextValue(); String formattedStr = JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,SerializerFeature.WriteDateUseDateFormat); System.out.println(formattedStr);
上述代碼中,我們首先定義了一個JSON字符串,將它通過JSONTokener類進行解析,再使用JSON.toJSONString()方法將解析得到的JSON對象格式化輸出。
五、 JSON反序列化控制
fastjson從JSON字符串反序列化為Java對象時,我們可以控制反序列化的行為。例如,我們可以指定要忽略某些屬性、處理屬性名稱不一致的情況等等。下面是一些反序列化選項的例子:
// 忽略已知不需要的屬性 String jsonString = "{\"id\":1001,\"name\":\"Tom\",\"gender\":\"male\",\"height\":170}"; Person person = JSON.parseObject(jsonString, Person.class, new PropertyFilter() { public boolean apply(Object source, String name, Object value) { if ("height".equals(name)) { // 忽略屬性height return false; } return true; // 不忽略其他屬性 } }); System.out.println(person); // 把屬性名字不同的字符串屬性與Java屬性映射 String jsonString = "{\"name\":\"Tom\",\"person_age\":20}"; Map mappings = new HashMap(); mappings.put("age", "person_age"); // 把age屬性名映射成person_age Person person = JSON.parseObject(jsonString, Person.class, new PropertyNamingStrategy(){ public String translate(String propertyName) { if (mappings.containsKey(propertyName)) { return mappings.get(propertyName); } // 如果沒有映射關係,則按照默認規則轉換屬性名稱 return propertyName; } }); System.out.println(person);
上述代碼中,我們使用了PropertyFilter和PropertyNamingStrategy兩個接口來控制反序列化行為。PropertyFilter可以過濾掉不需要序列化的屬性,而PropertyNamingStrategy可以將屬性名映射成不同的名稱。
六、 性能提升
fastjson是一個高性能的JSON庫,但是我們可以通過一些措施來進一步提升它的性能。下面是一些提升fastjson性能的技巧:
6.1 使用asm庫
ASM是一個Java字節碼操縱庫,可以直接編輯Java字節碼來實現優化。由於fastjson是通過動態生成Java代碼來實現JSON轉換,因此使用ASM庫可以進一步提升fastjson的性能。可以通過在引入fastjson的pom.xml文件中加入ASM庫的依賴來實現:
<dependency> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> <version>9.0</version> </dependency>
6.2 禁用setAccessible()
fastjson在進行反射操作時,首先會通過setAccessible()方法來打開Java對象的私有成員訪問權限,以便能夠操作私有成員。但是這個方法會消耗很多的時間,而且也存在安全問題,因此可以通過禁用這個方法來進一步提升fastjson的性能。
ParserConfig.getGlobalInstance().setAutoTypeSupport(true); //設置為true時,便禁用了setAccessible()的使用
6.3 壓縮JSON字符串
fastjson支持對JSON字符串進行壓縮,減小數據傳輸量和存儲空間的佔用。通過SerializerFeature.WriteSlashAsSpecial選項可以打開壓縮功能。
String jsonStr = "{\"name\":\"Tom\",\"age\":20}"; String compressedStr = JSON.toJSONString(jsonStr, SerializerFeature.WriteSlashAsSpecial); System.out.println(compressedStr); // 輸出:{"name":"Tom","age":20}
七、 結論
fastjson是一款高性能完善的JSON庫,它的功能非常強大,為使用者提供了很多API,可以隨心所欲地進行序列化和反序列化操作。在實際應用中,我們可以通過設置序列化選項和反序列化控制來滿足各種需求,同時還可以通過一些技巧進一步提升它的性能。
原創文章,作者:ZXSGK,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/360512.html