什么是fastjson
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串发序列化到Java Bean。
fastjson优点
速度快
fastjson相对其他的JSON库的特点是快,从2011年fastjson1.1x发布版本之后,其性能从未被其他Java实现的JSON库超越。
使用广泛
fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开运中国评选为最受欢迎的国产开源软件之一。
测试完备
fastjson有很多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。
使用简单
fastjson的API十分简洁
String text
= JSON
.toJSONString(obj
);
VO vo
= JSON
.parseObject("{...}",VO
.classs
);
功能完备
支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。
使用
maven中央仓库:http://central.maven.org/maven2/com/alibaba/fastjson/直接配置依赖
<dependency>
<groupId>com
.alibaba
</groupId
>
<artifactId>fastjson
</artifactId
>
<version> x
.x
.x
</version
>
</dependency
>
API
JSON这个类是fastjson API的入口,主要功能都通过这个类提供
序列化API
package com
.alibaba
.fastjson
;
public abstract class JSON {
public static String
toJSONString(Object object
, SerializerFeature
... features
);
public static byte[] toJSONBytes(Object object
, SerializerFeature
... features
);
public static void writeJSONString(Writer writer
,
Object object
,
SerializerFeature
... features
);
public static final int writeJSONString(OutputStream os
,
Object object
,
SerializerFeature
... features
);
}
JSON字符串反序列化API
package com
.alibaba
.fastjson
;
public abstract class JSON {
public static <T> T
parseObject(String jsonStr
,
Class
<T> clazz
,
Feature
... features
);
public static <T> T
parseObject(byte[] jsonBytes
,
Class
<T> clazz
,
Feature
... features
);
public static <T> T
parseObject(String text
,
TypeReference
<T> type
,
Feature
... features
);
public static JSONObject
parseObject(String text
);
}
DEMO
parse Tree
import com
.alibaba
.fastjson
.*
;
JSONObject jsonObj
= JSON
.parseObject(jsonStr
);
parse POJO
import com
.alibaba
.fastjson
.JSON
;
Model model
= JSON
.parseObject(jsonStr
, Model
.class);
parse POJO Generic
mport com
.alibaba
.fastjson
.JSON
;
Type type
= new TypeReference<List
<Model>>() {}.getType();
List
<Model> list
= JSON
.parseObject(jsonStr
, type
);
convert POJO to string
import com
.alibaba
.fastjson
.JSON
;
Model model
= ...;
String jsonStr
= JSON
.toJSONString(model
);
convert POJO to json bytes
import com
.alibaba
.fastjson
.JSON
;
Model model
= ...;
byte[] jsonBytes
= JSON
.toJSONBytes(model
);
write POJO as json string to OutputStream
import com
.alibaba
.fastjson
.JSON
;
Model model
= ...;
OutputStream os
;
JSON
.writeJSONString(os
, model
);
write POJO as json string to Writer
import com
.alibaba
.fastjson
.JSON
;
Model model
= ...;
Writer writer
= ...;
JSON
.writeJSONString(writer
, model
);
JSONField
介绍
注意:若属性是私有的,必须有set方法。否则无法序列化
public @
interface JSONField {
int ordinal() default 0;
String
name() default "";
String
format() default "";
boolean serialize() default true;
boolean deserialize() default true;
SerializerFeature
[] serialzeFeatures() default {};
Feature
[] parseFeatures() default {};
String
label() default "";
boolean jsonDirect() default false;
Class
<?> serializeUsing() default Void
.class;
Class
<?> deserializeUsing() default Void
.class;
String
[] alternateNames() default {};
boolean unwrapped() default false;
}
配置方式
JSONField可以配置在字段或者setter/getter方法上。例如:
配置在字段上
public class A{
@JSONField(name
="ID")
private int id
;
public int getId() {return id
;}
public void setId(int value
) {this.id
= id
;}
}
配置在setter/getter上
public class A {
private int id
;
@JSONField(name
="ID")
public int getId() {return id
;}
@JSONField(name
="ID")
public void setId(int value
) {this.id
= id
;}
}
使用format配置日期格式化
public class A{
@JSONField(format
="yyyyMMdd")
public Date date
;
}
使用serialize/deserialize指定字段不序列化
public class A {
@JSONField(serialize
=false)
public Date date
;
}
public class A {
@JSONField(deserialize
=false)
public Date date
;
}
使用ordinal指定字段的顺序
public static class VO {
@JSONField(ordinal
= 3)
private int f0
;
@JSONField(ordinal
= 2)
private int f1
;
@JSONField(ordinal
= 1)
private int f2
;
}
JSONPath
介绍
可以在java框架中当作对象查询语言使用
API
package com
.alibaba
.fastjson
;
public class JSONPath {
public static Object
eval(Object rootObject
, String path
);
public static int size(Object rootObject
, String path
);
public static boolean contains(Object rootObject
, String path
) { }
public static boolean containsValue(Object rootObject
, String path
, Object value
) { }
public static boolean set(Object rootObject
, String path
, Object value
) {}
public static boolean array_add(Object rootObject
, String path
, Object
... values
);
}
支持语法
JSONPATH描述
$根对象,例如$.name[num]数组访问,其中num是数字,可以是符数。例如$[0].leader.departments[-1].name[num0,num1,…]数组多个元素访问,其中num是数字,可以是负数,返回数组中的多个元素。例如$[0,3,-1,4][start:end]数组范围访问,其中start和end是开始下标和结束下标,可以是负数,返回数组中的多个元素。例如$[0:5][?(key)]对象属性非空过滤,例如$.departs[?(name)][key > 123]数值类型对象属性比较过滤,例如$.departs[id>=123],比较操作符支持=,!=,>,>=,<,<=[key like ‘aa%’]字符串类型like过滤,例如departs[name like ‘aa(.)*’],通配符只支持%;支持not like[key rlike ‘regexpr’]字符串类型正则匹配过滤,例如departs[name like ‘aa(.)*’],正则语法为jdk的正则语法,支持not rlike[key between 234 and 456]BETWEEN过滤, 支持数值类型,支持not between 例如:
.
d
e
p
a
r
t
s
[
i
d
b
e
t
w
e
e
n
101
a
n
d
201
]
;
.departs[id between 101 and 201];
.departs[idbetween101and201];.departs[id not between 101 and 201]length() 或者 size()数组长度。例如$.values.size() 支持类型java.util.Map和java.util.Collection和数组.属性访问,例如$.name…deepScan属性访问,例如$…name*对象的所有属性,例如$.leader.*[‘key’]属性访问。例如$[‘name’][‘key0’,‘key1’]多个属性访问。例如$[‘id’,‘name’]
toString
介绍
toString 将java对象序列化为JSON字符串,fastjson提供了一个最简单的入口
package com
.alibaba
.fastjson
;
public abstract class JSON {
public static String
toJSONString(Object object
);
}
writeJSONString
介绍
Fastjson在1.2.11版中,JSON类新增对OutputStream/Writer直接支持
package com
.alibaba
.fastjson
;
public abstract class JSON {
public static final int writeJSONString(OutputStream os
,
Object object
,
SerializerFeature
... features
) throws IOException
;
public static final int writeJSONString(OutputStream os
,
Charset charset
,
Object object
,
SerializerFeature
... features
) throws IOException
;
public static final int writeJSONString(Writer os
,
Object object
,
SerializerFeature
... features
) throws IOException
;
}
pareObject
介绍
在1.2.11版本中,fastjson新增加了对InputStream的支持
package com
.alibaba
.fastjson
;
public abstract class JSON {
public static <T> T
parseObject(InputStream is
,
Type type
,
Feature
... features
) throws IOException
;
public static <T> T
parseObject(InputStream is
,
Charset charset
,
Type type
,
Feature
... features
) throws IOException
;
}
Api Stream
Fastjson 当需要处理超大JSON文本时,需要Stream API
序列化
超大数组序列化
如果你的JSON格式是一个巨大的JSON数组,有很多元素,则先调用startArray,然后挨个写入对象,然后调用endArray
JSONWriter writer
= new JSONWriter(new FileWriter("文件位置"));
writer
.startArray();
for(int i
=0;i
<1000*1000;++i
){
writer
.writeValue(new VO());
}
writer
.endArray();
writer
.close();
超大JSON对象序列化
如果你的JSON格式是一个巨大的JSONObject,有很多Key/Value对,则先调用startObject,然后挨个写入Key和Value,然后调用endObject。
JSONWriter writer
= new JSONWriter(new FileWriter("文件位置"));
writer
.startObject();
for(int i
=0;i
<1000*1000;++i
){
writer
.writeKey("x"+i
);
writer
.writeVaue(new VO());
}
wirter
.endObject();
wirter
.close();