Fastjson简介:
Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象。Fastjson可以与任意Java对象一起使用,包括您没有源代码的现有对象。
Fastjson目标
- 在服务器端和android客户端中提供最佳性能。
- 提供简单的toJSONString()和parseObject()方法,将Java对象转换为JSON,反之亦然。
- 允许将现有的不可修改的对象与JSON相互转换。
- Java泛型的广泛支持。
- 允许对象的自定义表示。
- 支持任意复杂的对象(具有深层次的继承层次结构和泛型类型的广泛使用)。
目前,在比较流行的Jackson、Gson、Fastjson三个json库中,Fastjson性能是最快的,但是Fastjson存在高危漏洞,不建议生产使用。Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
Maven依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.68</version>
</dependency>
实体类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{
private int id;
private String name;
private int age;
}
对象转换成json:
//将对象转换成json
private static String tojson() {
User user = new User(12, "中国1", 19);
//格式化json,默认是false
String str = JSON.toJSONString(user, true);
//非格式化json
//String str = JSON.toJSONString(user,false);
//String str = JSON.toJSONString(user);
System.out.println(str);
return str;
}
json转换成对象:
//对象转换json
private static void parseobject() {
String json = tojson();
User user = JSON.parseObject(json, User.class);
System.out.println(user.toString());
}
复杂对象(List、Set、Map) 转json:
//复杂对象转json
private static String tojsoncomplex(){
User user = new User(12, "中国1", 19);
User user1 = new User(13, "中国2", 20);
User user2 = new User(14, "中国3", 21);
List list = new ArrayList();
list.add(user);
list.add(user1);
list.add(user2);
Map map = new HashMap();
map.put("test","test");
map.put("user",list);
String str = JSON.toJSONString(map);
System.out.println(str);
return str;
}
json转换成复杂对象:
private static void parseobjectcomplex(){
String json = tojsoncomplex();
Map map = JSON.parseObject(json,new TypeReference<Map>(){});
System.out.println(map);
}
获取json字符串中的属性:
String json = tojsoncomplex();
JSONObject jsonObject = JSON.parseObject(json);
String test = jsonObject.getString("test");
List list = jsonObject.getJSONArray("user");
System.out.println(list);
System.out.println(test);
去除json字符串的某个属性:
String json = tojsoncomplex();
JSONObject jsonObject = JSON.parseObject(json);
jsonObject.remove("test");
System.out.println(jsonObject.toString());
增加json字符串属性:
String json = tojsoncomplex();
JSONObject jsonObject = JSON.parseObject(json);
jsonObject.put("test2", "test2");
System.out.println(jsonObject.toString());
修改json字符串属性: 同增加属性方法一样
判断属性或值是否存在:
String json = tojsoncomplex();
JSONObject jsonObject = JSON.parseObject(json);
List list = jsonObject.getJSONArray("user");
System.out.println(jsonObject.containsKey("test2"));
System.out.println(jsonObject.containsValue(list));
json日期格式:
String str = JSON.toJSONStringWithDateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(str);
Fastjson默认的空值处理:
在Fastjson中,默认情况下是不输出空值(NULL)的。无论Map中的NULL和对象属性中的NULL,序列化的时候都会被忽略不输出,这样会减少产生文本的大小。
如果要输出空值:需要设置SerializerFeature常量值来控制NULL值的输出
User user3 = new User();
user3.setAge(22);
user3.setId(15);
//改为不忽略NULL值
String jsonstring = JSON.toJSONString(user3, SerializerFeature.WriteMapNullValue);
System.out.println(jsonstring);
fastjson还有两个常用的注解
@JSONField: 配置在字段或者getter/setter方法上
public @interface JSONField {
// 配置序列化和反序列化的顺序,1.1.42版本之后才支持
int ordinal() default 0;
// 指定字段的名称
String name() default "";
// 指定字段的格式,对日期格式有用
String format() default "";
// 是否序列化
boolean serialize() default true;
// 是否反序列化
boolean deserialize() default true;
}
public class VO {
@JSONField(name="ID",deserialize=false)
private int id;
@JSONField(name="birthday",format="yyyy-MM-dd",serialize=false)
public Date date;
@JSONField(ordinal = 3)
private int f0;
@JSONField(ordinal = 2)
private int f1;
@JSONField(ordinal = 1)
private int f2;
}
**@JSONType**注解和@JSONField注解的作用类似,但@JSONType是配置在类上。
//不序列化studentAge和studentGender属性
@JSONType(ignores = {"studentAge","studentGender"})
public class Student {
private String studentName;
private Integer studentAge;
private String studentGender;
}