阿里巴巴提供的JSON框架。实现Java对象与JSON格式字符串的相互转换,十分方便。
序列化:Java Bean转为JSON 字符串。
String jsonString = JSON.toJSONString(obj);
反序列化:JSON 字符串转为Java Bean。
User user = JSON.parseObject("...", User.class);
pom.xml文件中添加依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.78</version>
</dependency>
一、类层次结构
查看包结构,用的比较多的主要是:JSON、JSONArray、JSONObject 这三个类。
(JSONObject 里面还有内部类,所有类前有个 > 符号)
JSON类是抽象类,实现了JSONStreamAware, JSONAware 两个接口。
JSONStreamAware接口仅有一个方法,唯一的实现类即是JSON(JSONArray、JSONObject都继承了JSON)
JSONAware接口也仅有一个方法,有两个实现类:JSON、JSONPath。
JSON类中,ctrl+O,搜索toJSONString方法,可以看到有很多的重载方法。
一般用Object参数的即可。(m表示方法,圆圈的左下角有个菱形,表示是类的静态方法)
二、JSON
1、JSON.parse() 返回的是Object对象。
2、JSON.parseArray() 返回的是:JSONArray 或 List<T>、或 List<Object> 。
3、JSON.parseObject() 返回的是:JSONObject 或 <T> T 。
4、JSON.toJSONString() 返回的是:String 。
5、JSON.toJSONBytes() 返回的是:byte[] 。
JSONArray、JSONObject都继承了JSON,并各自实现了一些接口,它们都没有静态方法。通用的静态方法均通过 JSON 类直接调用。
Map中的每个键值对,对应JavaBean中的一个属性。键为属性名,值为属性值。Java中,一个Map<String, Object>
对象可以等价描述为一个JavaBean
。JSONObject即是这样场景下的Map。
(1)toJSONString(Object object) 转为字符串
private static final Logger logger = LoggerFactory.getLogger(Test.class);
public static void main(String[] args) {
Student student = new Student("张三",18,"001","深圳");
Map map = new HashMap();
map.put("name","zs");
map.put("age",20);
logger.info("输出信息:{}",JSON.toJSONString(student));
logger.info("map信息:{}",JSON.toJSONString(map));
}
//输出
16:09:08.475 [main] INFO com.xiexie.demo.Test - 输出信息:{"address":"深圳","age":18,"name":"张三","stuNum":"001"}
16:09:08.491 [main] INFO com.xiexie.demo.Test - map信息:{"name":"zs","age":20}
(2)parseObject(String text, Class<T> clazz) 转为Java 对象
String jsonStr = "{name:'李四',age:'12',stuNum:'002',address:'广州'}";
Student parse = JSON.parseObject(jsonStr,Student.class);
System.out.println("parse = " + parse);
String sss = JSON.toJSONString(parse);
System.out.println(sss);
//输出
parse = Student(name=李四, age=12, stuNum=002, address=广州)
{"address":"广州","age":12,"name":"李四","stuNum":"002"}
(3)parseObject(String text) 转为JSONObject 对象(本质是一个map)
对于不同类型的各种属性,JSONObject 提供了对应类型的getXXX()
方法。
JSONObject jsonObject = JSON.parseObject(str);
//获取返回值为String类型的值;get返回object类型值
String name = jsonObject.getString("name");
Integer age = jsonObject.getInteger("age");
(4)parseArray(String text, Class<T> clazz) 转为list集合
List<Student> students = JSON.parseArray(str, Student.class);
三、@JSONField 注解
(1)name属性
一般,JSON字段中的名字和类的属性是一致的。有时需要指定/修改JSON中的字段名时,可以使用@JSONField 注解+name 。
Student student = new Student("张三",18,"001","深圳");
String str = JSON.toJSONString(student);
System.out.println(str);
Student student1 = JSON.parseObject(str, Student.class);
System.out.println("student1 = " + student1);
//输出
str = {"add":"深圳","age":18,"name666":"张三","stuNum":"001"}
student1 = Student(name=张三, age=18, stuNum=001, address=深圳)
(2)serialzeFeatures 属性
将对象转为JSON 格式字符串时,fastJson 会自动忽略值为 null 的属性。需要以完整形式展示对象的所有属性时,需要设置 @JSONField 注解的 serialzeFeatures 属性值。
@JSONField(name = "name666",serialzeFeatures = {SerializerFeature.WriteMapNullValue})
private String name;
Student student = new Student(null,18,"001","深圳");
String str = JSON.toJSONString(student);
System.out.println("str = " + str);
//输出
str = {"add":"深圳","age":18,"name666":null,"stuNum":"001"}
(3)format 属性
属性有 Date 类型时,涉及到 Date 类型的字符串格式转化问题,可以使用format 属性自定义字符串格式。
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date birthDate;
(4)serialize 属性(默认是true)
属性上标注了 @JSONField(serialize=false) 的属性,在序列化为JSON格式字符串的过程中,会被 fastJSON 忽略,不管是否有值,均不序列化。