什么是fastjson
fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
在maven项目的pom文件中直接配置fastjson依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
Fastjson 主要的API
package com.alibaba.fastjson;
public abstract class JSON {
// Java对象转换为JSON字符串
public static final String toJSONString(Object object);
//JSON字符串转换为Java对象
public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
}
- 序列化
String jsonString = JSON.toJSONString(obj);
- 反序列化
VO vo = JSON.parseObject("...", VO.class);
- 泛型反序列化
import com.alibaba.fastjson.TypeReference;
List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});
- 支持 BeanToArray 序列化功能
String jsonOutput= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);
使用@JSONField配置
- JSONField 注解介绍
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.alibaba.fastjson.annotation;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@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对生成的json格式的数据进行一些定制,比如可以输入的格式更好看,使用单引号而非双引号等,是使用SerializerFeature枚举中的指定序列化方式
SerializerFeature[] serialzeFeatures() default {};
//决定了解析器是否将自动关闭那些不属于parser自己的输入源
Feature[] parseFeatures() default {};
//给属性打上标签, 相当于给属性进行了分组
String label() default "";
//你有⼀个字段是字符串类型,⾥⾯是json格式数据,你希望直接输⼊,⽽不是经过转义之后再输出 将这个值置为true
boolean jsonDirect() default false;
Class<?> serializeUsing() default Void.class;
Class<?> deserializeUsing() default Void.class;
String[] alternateNames() default {};
boolean unwrapped() default false;
}
- 可以把@JSONField配置在字段或者getter/setter方法上。(若属性是私有的,必须有set*方法。否则无法反序列化。)
- 常用注解
注解 | 作用 |
---|---|
@JSONField(format=“yyyyMMdd”) | 配置序列化和反序列使用yyyyMMdd日期格式 |
@JSONField(serialize=false) | 指定字段不序列化 |
@JSONField(deserialize=false) | 指定字段不序列化 |
@JsonIgnore | 指定字段不序列化 |
@JSONField(ordinal = 3) | 指定序列化顺序 |
@JSONField(name = “”) | 前端传递来的名字不一致时,使用该注解 |
使用@JSONType配置
- JSONType 注解介绍
package com.alibaba.fastjson.annotation;
import com.alibaba.fastjson.PropertyNamingStrategy;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializeFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface JSONType {
boolean asm() default true;
String[] orders() default {};
String[] includes() default {};
String[] ignores() default {};
SerializerFeature[] serialzeFeatures() default {};
Feature[] parseFeatures() default {};
boolean alphabetic() default true;
Class<?> mappingTo() default Void.class;
Class<?> builder() default Void.class;
String typeName() default "";
String typeKey() default "";
Class<?>[] seeAlso() default {};
Class<?> serializer() default Void.class;
Class<?> deserializer() default Void.class;
boolean serializeEnumAsJavaBean() default false;
PropertyNamingStrategy naming() default PropertyNamingStrategy.CamelCase;
Class<? extends SerializeFilter>[] serialzeFilters() default {};
}
- JSONType 注解介绍
和JSONField类似,但JSONType配置在类上,而不是field或者getter/setter方法上。
2. JSONType常用注解
注解 | 作用 |
---|---|
@JSONType(includes = {“name”,“sex”}) | 序列化的字段包括name和sex |
@JSONType(ignores ={“id”, “sex”}) | 序列化的字段不包括name和sex |
Demo
创建BlackListVo类,分别使用@JSONField(serialize=false)让字段不会序列化,@JSONField(ordinal = 2)指定序列化顺序,@JSONField(format=“yyyyMMdd”)配置日期格式
package com.cottoneasy.monitor.blacklist.vo;
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.sinosoft.dandelion.system.client.params.DataItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import net.minidev.json.annotate.JsonIgnore;
import java.util.Date;
/**
* 黑灰名单分页列表vo
* @author lsh
* @date 2021/12/16
*/
@Data
@Accessors(chain = true)
public class BlackListVo {
/**
*主键
*/
@ApiModelProperty(value = "主键")
@JSONField(serializeUsing = ToStringSerializer.class,ordinal = 3)
private Long id;
/**
*客户id
*/
@ApiModelProperty(value = "客户id")
@JSONField(serialize=false)
private String customId;
/**
*客户编码
*/
@ApiModelProperty(value = "客户编码")
@JSONField(ordinal = 1)
private String customCode;
/**
*客户名称
*/
@ApiModelProperty(value = "客户名称")
@JSONField(ordinal = 2)
private String customName;
/**
*创建时间
*/
@ApiModelProperty(value = "创建时间")
@JSONField(format="yyyyMMdd",ordinal = 4)
private Date createTime;
}
测试类
package com.cottoneasy;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.cottoneasy.monitor.blacklist.vo.BlackListVo;
import lombok.extern.slf4j.Slf4j;
import org.junit.runner.RunWith;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.function.BiConsumer;
/**
* @author lsh
* @date 2021/11/25
*/
@RunWith(SpringJUnit4ClassRunner.class)
@Slf4j
public class Testxxx {
@Test
public void testFastJson() {
BlackListVo blackListVo = new BlackListVo();
List<BlackListVo> list = new ArrayList<>();
blackListVo.setCreateTime(new Date())
.setCustomId("111111")
.setCustomName("客户名称")
.setId(1L)
.setCustomCode("666666");
list.add(blackListVo);
String jsonString = JSON.toJSONString(blackListVo);
BlackListVo vo = JSON.parseObject(jsonString, BlackListVo.class);
String listJsonString = JSON.toJSONString(list);
List<BlackListVo> newlist = JSON.parseObject(listJsonString, new TypeReference<List<BlackListVo>>() {});
System.out.println("blackListVo转换成json字符串是:"+jsonString);
System.out.println("json字符串转换成BlackListVo对象是:"+vo);
System.out.println("list转换成json字符串是:"+listJsonString);
System.out.println("listJsonString字符串转换成List<BlackListVo>是:"+newlist);
}
}