fastjson

什么是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);
}
  1. 序列化
String jsonString = JSON.toJSONString(obj);
  1. 反序列化
VO vo = JSON.parseObject("...", VO.class);
  1. 泛型反序列化
import com.alibaba.fastjson.TypeReference;

List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});
  1. 支持 BeanToArray 序列化功能
String jsonOutput= JSON.toJSONString(listOfPersons, SerializerFeature.BeanToArray);

使用@JSONField配置

  1. 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;
}
  1. 可以把@JSONField配置在字段或者getter/setter方法上。(若属性是私有的,必须有set*方法。否则无法反序列化。
  2. 常用注解
注解作用
@JSONField(format=“yyyyMMdd”)配置序列化和反序列使用yyyyMMdd日期格式
@JSONField(serialize=false)指定字段不序列化
@JSONField(deserialize=false)指定字段不序列化
@JsonIgnore指定字段不序列化
@JSONField(ordinal = 3)指定序列化顺序
@JSONField(name = “”)前端传递来的名字不一致时,使用该注解

使用@JSONType配置

  1. 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 {};
}
  1. 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);
	}
}

以上是测试结果,与预期一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值