该篇,会总结FastJson中的一些常用API
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)
- 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);
反序列化
反序列一个javaBean对象:
public class User {
private int id;
private String name;
private String address;
public User() {
}
}
String json = "{'id':18,'name':'gakki'}";
User user = JSON.parseObject(json, User.class);
System.out.println(user);
User{id=18, name='gakki', address='null'}
说明:这里我们直接将json字符串反序列了javaBean对象:user,使用是带有Class参数的parseObject方法,不需要再操作JSOObject对象了,方便了很多。
反序列化json数组《一》:
String json = "[{'id':18,'name':'gakki'},{'id':19,'name':'dj','address':'东京'},{'id':20,'name':'ldlove','address':'冲绳'}]";
List<User> userList = JSON.parseArray(json, User.class);
System.out.println(userList);
[User{id=18, name='gakki', address='null'}, User{id=19, name='dj', address='东京'}, User{id=20, name='ldlove', address='冲绳'}]
看到这里,小伙伴们,是否发现了FastJson对于GSON的区别,GSON反序列化数组类型时,需要使用TypeToken来保存泛型类型,这里FastJson直接使用User.class即可,不过使用的是:parseArray 方法,注意区别 parseObejc。
反序列化json数组《二》:
String json = "[{'id':18,'name':'gakki'},{'id':19,'name':'dj','address':'东京'},{'id':20,'name':'ldlove','address':'冲绳'}]";
List<User> userList = JSON.parseObject(json, new TypeReference<List<User>>(){});
System.out.println(userList)
这里,我们使用的是:parseObject方法,但是第二个参数不再是User.class,而是: TypeReference对象,这里就和GSON中的:TypeToken对象类似了,都是创建匿名子类对象来保存泛型信息。
序列化
序列化一个javaBean对象:
User user = new User(18,"gakki","冲绳");
String json = JSON.toJSONString(user);
System.out.println(json);
{"address":"冲绳","id":18,"name":"gakki"}
说明:直接使用:toJSONString方法,不再使用JSONObject对象来put一系列操作了,方便了很多。
序列化javaBean数组或List集合
List<User> userList = new ArrayList<>();
userList.add(new User(18, "gakki", "冲绳"));
userList.add(new User(19, "gakkij", "东京"));
userList.add(new User(20, "gakkil", "上海"));
String json = JSON.toJSONString(userList);
System.out.println(json);
[{"address":"冲绳","id":18,"name":"gakki"},{"address":"东京","id":19,"name":"gakkij"},{"address":"上海","id":20,"name":"gakkil"}]
当序列化的javaBean对象中,有null值的情况:
User user = new User(18, "gakki", null);
System.out.println(user);
String json = JSON.toJSONString(user);
System.out.println(json);
User{id=18, name='gakki', address='null'}
{"id":18,"name":"gakki"}
默认情况是:不序列化值为null,如果我们也想序列化值为null的情况呢? 就和GSON中使用GsonBuilder一样。
User user = new User(18, "gakki", null);
System.out.println(user);
String json = JSON.toJSONString(user, SerializerFeature.WriteMapNullValue);
System.out.println(json);
User{id=18, name='gakki', address='null'}
{"address":null,"id":18,"name":"gakki"}
我们只需要使用 toJSONString的其他重载的方法,带上:SerializerFeature的参数即可,比GSON中需要使用GsonBuilder来的方便有没有!
SerializerFeature.WriteMapNullValue:将值为null的也输出为 null。
SerializerFeature还有很多选择的类型,大家可以自己去试试:
User user = new User(18, "gakki", null);
System.out.println(user);
String json = JSON.toJSONString(user, SerializerFeature.WriteNullStringAsEmpty);
System.out.println(json);
User{id=18, name='gakki', address='null'}
{"address":"","id":18,"name":"gakki"}
SerializerFeature.WriteNullStringAsEmpty:输出为:” “ ,不再是 null 。
User user = new User(18, "gakki", null);
System.out.println(user);
String json = JSON.toJSONString(user,SerializerFeature.PrettyFormat,SerializerFeature.WriteNullStringAsEmpty);
System.out.println(json);
User{id=18, name='gakki', address='null'}
{
"address":"",
"id":18,
"name":"gakki"
}
SerializerFeature.PrettyFormat:输出为漂亮的格式。
PS:JSON.toJSONString中的SerializerFeature.XXXX 可以是多个。
public static String toJSONString(Object object, SerializerFeature... features) {
return toJSONString(object, DEFAULT_GENERATE_FEATURE, features);
}
人家是可变参数!!!