简介
说明
本文用实例介绍Fastjson的用法。
项目中我们经常会用到JSON,比如:将JSON字符串反序列化为对象、将对象序列华为JSON字符串。
实际我们常用的是SpringBoot默认的JackSon与阿里巴巴的FastJson。Jackson更稳定,基本没有缺陷;FastJson功能更丰富,缺陷多一些。
Fastjson一开始是为了处理非标准的json的。
依赖
compile 'com.alibaba:fastjson:1.2.55'
注意事项
1.序列化的类必须有一个无参构造方法
否则会报错:Exception in thread “main” com.alibaba.fastjson.JSONException: default constructor not found. class
2、避免子类重写父类成员变量,有可能报错
3、fastjson在解析时候会将以is为开头命名属性的is去掉
注解大全
注解名称 | 作用 | 示例 |
@JSONField | 控制字段的序列化和反序列化行为,支持字段名称、格式、顺序等配置。 | @JSONField(name = “user_name”, ordinal = 1 |
@JSONCreator | 反序列化时标注构造函数或静态工厂方法,快速构建对象。 | |
@JSONPOJOBuilder | 与构建器模式结合,指示如何从 JSON 创建对象 | |
@JSONType | 用于类级别,控制整个类的序列化行为。 | |
@JSONField字段说明
1.name 指定JSON序列化的字段名称
2.format 指定字段的格式,对日期格式有用
3.serialize 是否序列化
4.serializerFeature 通过SerializerFeature对生成的json格式的数据进行一些定制,比如可以输入的格式更好看,使用单引号而非双引号等,是使用SerializerFeature枚举中的指定序列化方式
5.parseFeatures 决定了解析器是否将自动关闭那些不属于parser自己的输入源 ,见Feature
6.label 给属性打上标签, 相当于给属性进行了分组
7.jsonDirect 你有⼀个字段是字符串类型,里边是json格式数据,你希望直接输入,而不是经过转义之后再输出 将这个值置为true。
字符串转对象
方法 | 作用 | 参数说明 |
public static final Object parse(String text); | 把JSON字符串转为JSONObject或JSONArray | |
public static final JSONObject parseObject(String text); | 把JSON字符串转成JSONObject | |
public static final <T> T parseObject(String text, Class<T> clazz); | 把JSON字符串转为JavaBean | clazz:指定反序列化后的类 |
public static final <T> T parseObject(String text, TypeReference type, Feature… features) | 把JSON字符串转为JavaBean | type:构造转化类型,features:反序列化额外属性 |
public static final JSONArray parseArray(String text); | 把JSON字符串转成JSONArray | |
public static final <T> List<T> parseArray(String text, Class<T> clazz); | 把JSON字符串转成JavaBean集合 |
JSON/Bean互转
方法 | 作用 | 参数说明 |
public static final Object toJSON(Object javaObject); | 将JavaBean转为JSONObject或JSONArray。 | javaObject:java对象 |
public static final <T> T toJavaObject(JSON json, Class<T> clazz) | 将JSONObject或JSONArray转为JavaBean | json:json对象,clazz:要转化的类型 |
对象转JSON字符串
方法 | 作用 | 参数说明 |
public static final String toJSONString(Object object); | 将JavaBean序列化为JSON文本 | object: 需要进行序列化的对象javaBean或者JSONObject |
public static final String toJSONString(Object object, boolean prettyFormat); | 将JavaBean序列化为带格式的JSON文本。 | prettyFormat:是否格式化输出json字符串 |
public static final String toJSONString(Object object, SerializerFeature… features) | 将JavaBean序列化为带格式的JSON文本。 | features:序列化额外属性配置,非必填 |
public static final String toJSONStringWithDateFormat(Object object, String dateFormat, SerializerFeature… features) | 序列化时格式化日期 | dateFormat:日期格式(例如:yyyy-MM-dd) |
示例
java对象序列化为string
String jsonString = JSON.toJSONString(user);
字符串转为Map
方法 |
Map maps = (Map) JSON.parse(str); for (Object map : maps.entrySet()) { System.out.println(((Map.Entry) map).getKey() + “===>” + ((Map.Entry) map).getValue()); } |
Map maps = JSON.parseObject(str); for (Object obj : maps.keySet()) { System.out.println(obj + “===>” + maps.get(obj)); } |
Map maps = JSON.parseObject(str, Map.class); for (Object obj : maps.keySet()) { System.out.println(obj + “===>” + maps.get(obj)); } |
Map maps = (Map) JSONObject.parse(str); for (Object map : maps.entrySet()) { System.out.println(((Map.Entry) map).getKey() + “===>” + ((Map.Entry) map).getValue()); } |
JSONObject maps = JSONObject.parseObject(str); for (Object map : maps.entrySet()) { System.out.println(((Map.Entry) map).getKey() + “===>” + ((Map.Entry) map).getValue()); } |
Map maps = JSONObject.parseObject(str, Map.class); for (Object map : maps.entrySet()) { System.out.println(((Map.Entry) map).getKey() + “===>” + ((Map.Entry) map).getValue()); } |
JSONObject
简介
JSONObject实现了Map,所以它有Map所有方法。
getString,getLong等getXXX方法,都是调用FastJson包的TypeUtils.java的方法。例如:TypeUtils.castToString(obj)
常用操作
可以连续调用getJSONObject以获得最终的值。比如:数据如下
{ "a": { "aa":{ "aaa": 100 } } "b": 2 }
获得”aaa”的值的方法:假设字符串为str,则如下:
JSONObject.parseObject(str) .getJSONObject("a") .getJSONObject("aa") .getInteger("aaa");
JSONArray
简介
JSONArray实现了List,所以它有List所有方法。
JSONObject有的方法,JSONArray基本都有。区别是,JSONObject的getXXX的入参是字符串,而JSONArray的入参是index(索引值)。
类的关系
简介
FastJson对于json格式字符串的解析主要用到了一下三个类:
- JSON:主要实现json对象,json对象数组,javabean,json字符串之间的相互转化。 转换后取值按各自的方法进行。
- JSONObject:fastJson提供的json对象。JSONObject是Map接口的实现类,可以直接用Map接口方法操作。
- JSONArray:fastJson提供JSON对象数组,通常是通过迭代器取得其中的JSONObject,再利用JSONObeject的get()方法进行取值。
JSONObject
JSONObject是Map接口的实现类,类中主要是get()方法。JSONObject相当于json对象,该类中主要封装了各种get方法,通过”键:值”对中的键来获取其对应的值。
JSONArray
JSONArray的内部是通过List接口中的方法来完成操作的。JSONArray代表json对象数组,json数组对象中存储的是一个个json对象,所以类中的方法主要用于直接操作json对象。比如其中的add(),remove(),containsAll()方法,对应于json对象的添加,删除与判断。 其内部主要由List接口中的对应方法来实现。
跟JSONObject一样,JSONArray里面也有一些get()方法,不过不常用,最有用的应该是getJSONObject(int index)方法,该方法用于获取json对象数组中指定位置的JSONObject对象,配合size()方法,可用于遍历json对象数组中的各个对象。 通过以上两个方法,在配合for循环,即可实现json对象数组的遍历。此外JSONArray中也实现了迭代器方法来遍历。 通过遍历得到JSONObject对象,然后再利用JSONObject类中的get()方法,即可实现最终json数据的获取。
JSON
JSON类主要是实现转化用的,最后的数据获取,还是要通过JSONObject和JSONArray来实现。类中的主要是实现json对象,json对象数组,javabean对象,json字符串之间的相互转化。
请先
!