1 fastjson主要的API
fastjson入口類是com.alibaba.fastjson.JSON, 主要API是JSON.toJSONString和parseObject,使用fastjson要注意要轉換的類必須有預設的無參構造方法。
- 序列化:
String jsonString = JSON.toJSONString(obj);
- 反序列化:
VO vo = JSON.parseObject("jsonString", VO.class);
- 泛型反序列化:
List<VO> list = JSON.parseObject("jsonString", new TypeReference<List<VO>>(){});
注意:VO必須有預設無參構造方法
- 其他主要API:
public static final Object parse(String text); // 把JSON文本parse為JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse為JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化為JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化為帶格式的JSON文本
public static final Object toJSON(Object javaObject); 将JavaBean轉換為JSONObject或者JSONArray。
說明:
SerializeWriter:相當于StringBuffer
JSONArray:相當于List
JSONObject:相當于Map
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
- 反序列化能夠自動識别如下日期格式:
- ISO-8601日期格式
- yyyy-MM-dd
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd HH:mm:ss.SSS
- 毫秒數字
- 毫秒數字字元串
- NET JSON日期格式
- new Date(198293238)
3 過濾屬性
需要根據不同的環境傳回定制化傳回屬性時,可以使用SimplePropertyPreFilter。
- SimplePropertyPreFilter的代碼接口如下:
public class SimplePropertyPreFilter implements PropertyPreFilter {
public SimplePropertyPreFilter(String... properties){
this(null, properties);
}
public SimplePropertyPreFilter(Class<?> clazz, String... properties){
... ...
}
public Class<?> getClazz() {
return clazz;
}
public Set<String> getIncludes();
public Set<String> getExcludes();
...
}
你可以配置includes、excludes。當class不為null時,針對特定類型;當class為null時,針對所有類型。
當includes的size > 0時,屬性必須在includes中才會被序列化,excludes優先于includes。
-
使用方法:
在1.1.23版本之後,JSON提供新的序列化接口toJSONString,如下:
String JSON.toJSONString(Object, SerializeFilter, SerializerFeature...);
用法如下:
User user = new User();
user.setName("shamo");
user.setPwd("123");
user.setAge();
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(User.class, "pwd", "age");
Set<String> includes = filter.getIncludes();
Set<String> excludes = filter.getExcludes();
includes.add("name");
excludes.add("pwd");
String json = JSON.toJSONString(user, filter);
System.out.println(json);
輸出:
{"age":25,"name":"shamo"}
4 修改屬性
可以使用JSONObject對json形式的字元串進行任意的增删改
用法如下:
String jsonString = JSON.toJSONString(user);
JSONObject jsonObject = JSON.parseObject(jsonString);
jsonObject.put("gender", "male");
jsonObject.put("pwd","456");
jsonObject.remove("name");
String json = JSON.toJSONString(jsonObject);
System.out.println(json);
輸出:
{"pwd":"456","age":,"gender":"male"}
5 SerializerFeature序列化屬性
DisableCheckSpecialChar:一個對象的字元串屬性中如果有特殊字元如雙引号,将會在轉成json時帶有反斜杠轉移符。如果不需要轉義,可以使用這個屬性。預設為false
QuoteFieldNames———-輸出key時是否使用雙引号,預設為true
WriteMapNullValue——–是否輸出值為null的字段,預設為false
WriteNullNumberAsZero—-數值字段如果為null,輸出為0,而非null
WriteNullListAsEmpty—–List字段如果為null,輸出為[],而非null
WriteNullStringAsEmpty—字元類型字段如果為null,輸出為”“,而非null
WriteNullBooleanAsFalse–Boolean字段如果為null,輸出為false,而非null
WriteClassName:
支援序列化時寫入類型資訊,進而使得反序列化時不丢失類型資訊。例如:
Color color = Color.RED; String text = JSON.toJSONString(color,SerializerFeature.WriteClassName); System.out.println(text);
輸出結果:
{"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}
由于序列化帶了類型資訊,使得反序列化時能夠自動進行類型識别,例如:
String text = ...; //{"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}
Color color = (Color) JSON.parse(text);