alibaba Fastjson是由阿里开发用Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致。
版本releases:
https://github.com/alibaba/fastjson/releases
特点:
快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)
零依赖(没有依赖其它任何类库除了JDK)
常用序列化api:
//将Java对象序列化为JSON字符串
JSON.toJSONString(Object object, SerializerFeature... features);
//将Java对象序列化为JSON字符串,返回JSON字符串的utf-8 bytes
JSON.toJSONBytes(Object object, SerializerFeature... features);
//将Java对象序列化为JSON字符串,写入到Writer中
JSON.writeJSONString(Writer writer, Object object, SerializerFeature... features);
//将Java对象序列化为JSON字符串,按UTF-8编码写入到OutputStream中
JSON.writeJSONString(OutputStream os, Object object, SerializerFeature... features);
常用反序列化API
// 将JSON字符串反序列化为JavaBean
JSON.parseObject(String jsonStr, Class<T> clazz, Feature... features);
// 将JSON字符串反序列化为泛型类型的JavaBean
JSON.parseObject(String text, TypeReference<T> type, Feature... features);
//将JSON字符串反序列为JSONObject
JSON.parseObject(String text);
SerializerFeature属性
属性 | 备注 |
---|---|
QuoteFieldNames | 输出key时是否使用双引号,默认为true |
UseSingleQuotes | 使用单引号而不是双引号,默认为false |
WriteMapNullValue | 是否输出值为null的字段,默认为false |
WriteEnumUsingToString | Enum输出name()或者original,默认为false |
UseISO8601DateFormat | Date使用ISO8601格式输出,默认为false |
WriteNullListAsEmpty | List字段如果为null,输出为[],而非null |
WriteNullStringAsEmpty | 字符类型字段如果为null,输出为”“,而非null |
WriteNullNumberAsZero | 数值字段如果为null,输出为0,而非null |
WriteNullBooleanAsFalse | Boolean字段如果为null,输出为false,而非null |
SkipTransientField | 如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true |
SortField | 按字段名称排序后输出,默认为false |
WriteTabAsSpecial | 把\t做转义输出,默认为false 不推荐 |
JSONField配置方式
FieldInfo可以配置在getter/setter方法或者字段上。例如:
配置到getter/setter上
public class User {
private int id;
@JSONField(name="ID")
public int getId() {return id;}
@JSONField(name="ID")
public void setId(int value) {this.id = id;}
}
配置到属性字段上
public class User {
@JSONField(name="ID")
private int id;
public int getId() {return id;}
public void setId(int value) {this.id = id;}
}
指定字段是否序列化
@JSONField(serialize=false)
format配置日期格式化
// 配置date序列化和反序列使用yyyy-MM-dd日期格式
@JSONField(format="yyyy-MM-dd")
public Date date;
ordinal指定字段的顺序
@JSONField(ordinal = 2)
JSONObject变成Map的问题
1.2.55之后的版本,JSONObject.getJSONObject方法有变化,
新版本中如果发现get的值是Map类型的话,会return new JSONObject((Map)value); 本身JSONObject内部就是用的Map来存储数据,到这一步其实也没问题,问题在于程序在遍历使用这个JSONObject的值时候,比如用JSONObject的values方法,返回的Collection 这个集合里面的Object在新版本中会是Map类型的,这个时候如果强转成JSONObject就会出错,
以下代码在1.2.45中正常,在1.2.74中会报:java.util.HashMap cannot be cast to com.alibaba.fastjson.JSONObject
private static void testJSONObject(){
HashMap<String,HashMap<String,String>> map = new HashMap<String,HashMap<String,String>>();
HashMap<String,String> subMap = new HashMap<String, String>();
subMap.put("k1","v1");
map.put("subMap",subMap);
JSONObject json = new JSONObject();
json.put("map1",map);
JSONObject map1 = json.getJSONObject("map1");
for(Object obj:map1.values()){
System.out.println("值类型:"+obj.getClass());
JSONObject subJson = (JSONObject)obj; //报错行
}
}
同样在新版本中,JSONArray类的getJSONArray和getJSONObject也有变化,getJSONArray发现值是List的话,也会return JSONArray((List)value);
所以在使用的时候需要注意。