Fastjson 常用API

mac2024-03-26  32

什么是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 { // 将Java对象序列化为JSON字符串,支持各种各种Java基本类型和JavaBean public static String toJSONString(Object object, SerializerFeature... features); // 将Java对象序列化为JSON字符串,返回JSON字符串的utf-8 bytes public static byte[] toJSONBytes(Object object, SerializerFeature... features); // 将Java对象序列化为JSON字符串,写入到Writer中 public static void writeJSONString(Writer writer, Object object, SerializerFeature... features); // 将Java对象序列化为JSON字符串,按UTF-8编码写入到OutputStream中 public static final int writeJSONString(OutputStream os, // Object object, // SerializerFeature... features); }

JSON字符串反序列化API

package com.alibaba.fastjson; public abstract class JSON { // 将JSON字符串反序列化为JavaBean public static <T> T parseObject(String jsonStr, Class<T> clazz, Feature... features); // 将JSON字符串反序列化为JavaBean public static <T> T parseObject(byte[] jsonBytes, // UTF-8格式的JSON字符串 Class<T> clazz, Feature... features); // 将JSON字符串反序列化为泛型类型的JavaBean public static <T> T parseObject(String text, TypeReference<T> type, Feature... features); // 将JSON字符串反序列为JSONObject 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 ""; //当你有一个字段是字符串类类型,里面是json格式数据,你希望直接输入,而不是经过转义之后再输出 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{ //配置date序列化和反序列化使用yyyyMMdd日期格式 @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); // 计算Size,Map非空元素个数,对象非空元素个数,Collection的Size,数组的长度。其他无法求值返回-1 public static int size(Object rootObject, String path); // 是否包含,path中是否存在对象 public static boolean contains(Object rootObject, String path) { } // 是否包含,path中是否存在指定值,如果是集合或者数组,在集合中查找value是否存在 public static boolean containsValue(Object rootObject, String path, Object value) { } // 修改制定路径的值,如果修改成功,返回true,否则返回false 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();
最新回复(0)