一、什么是FastJson
Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。
二、使用方式
1、添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
2、将 Java 对象转换为 JSON 格式、以User 类为例
package com.ivan.json.entity;
import java.util.Date;
import com.alibaba.fastjson.annotation.JSONField;
public class User {
private Long id;
private String name;
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
测试fastjson的序列化与反序列化
package com.ivan.json;
import java.util.Date;
import com.alibaba.fastjson.JSON;
import com.ivan.json.entity.User;
public class SimpleTest {
public static void main(String[] args) {
serialize();
deserialize();
}
public static void serialize() {
User user = new User();
user.setId(11L);
user.setName("西安");
user.setCreateTime(new Date());
// 注意:也可以二进制输出
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
}
public static void deserialize() {
String jsonString = "{\"createTime\":\"2018-08-17 14:38:38\",\"id\":11,\"name\":\"西安\"}";
User user = JSON.parseObject(jsonString, User.class);
System.out.println(user.getName());
System.out.println(user.getCreateTime());
}
}
三、SerializerFeature特性的使用
fastjson通过SerializerFeature对生成的json格式的数据进行一些定制,比如可以输入的格式更好看,使用单引号而非双引号等。
package com.ivan.json;
import java.util.Date;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.ivan.json.entity.User;
public class SerializerFeatureTest {
public static void main(String[] args) {
User user = new User();
user.setId(11L);
user.setCreateTime(new Date());
String jsonString = JSON.toJSONString(user, SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.UseSingleQuotes);
System.out.println(jsonString);
}
}
输出的结果如下:
SerializerFeature常用属性另行百度
四、JSONField注解的使用
fastjson提供了JSONField对序列化与反序列化进行定制,比如可以指定字段的名称,序列化的顺序。JSONField用于属性,方法方法参数上。
package com.alibaba.fastjson.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface JSONField {
// 指定字段顺序
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
//字段级别的SerializerFeature
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;
}
在父类中,可以重写tostring方法,其所有的子类都集成了父类的tostring方法,进而达到每个子类都实现转化为json对象。
@Override
public String toString() {
return JSONObject.toJSONString(this);
}