fastjson中@jsonfield注解使用(代码片段)

专注着 专注着     2022-12-11     421

关键词:

最近做项目中,使用了json格式在服务器之间进行数据传输。但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式。

思路:

    1. 定义需要返回的bean,bean中定义需要返回的数据

     2. 获取到需要处理的JSON字符串

    3. 将JSON字符串转换为bean, 再将转换后的bean返回给客户端。


由于json中的key与bean中的属性不能匹配,因此在转换过程中出现了部分属性为null的情况。经过查看官方文档,发现可以使用@JSONField进行解释,但是并没有详细的使用说明。


@JSONField的作用对象:

 1. Field

  2. Setter 和 Getter方法

注:FastJson在进行操作时,是根据getter和setter的方法进行的,并不是依据Field进行。


介绍完@JSONField之后,针对以上场景,给出JAVA代码

一、作用Field

       @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。代码如下:

package org.java.json.fastjson.bean;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;

public class Person 

	@JSONField(name="name")
	private String name;
	
	@JSONField(name="age")
	private String age;
	
	@JSONField(name="desc")
	private String desc;
	
	public String getName() 
		return name;
	
	public void setName(String name) 
		this.name = name;
	
	public String getAge() 
		return age;
	
	public void setAge(String age) 
		this.age = age;
	
	public String getDesc() 
		return desc;
	
	public void setDesc(String desc) 
		this.desc = desc;
	
	
	public void setNAME(String NAME) 
		this.name = NAME;
	
	
	public void setAGE(String AGE) 
		this.age = AGE;
	
	
	public void setDESC(String DESC) 
		this.desc = DESC;
	
	
	public String toString() 
		return JSONObject.toJSONString(this);
	

package org.java.json.fastjson.json;

import org.java.json.fastjson.bean.Person;
import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson.JSONObject;

public class PersonTest 

	private Person person;
	
	/**
	 * 初始化对象
	 */
	@Before
	public void setUp() 
		person = new Person();
		person.setName("xianglj");
		person.setAge("20");
		person.setDesc("只是一个测试");
	
	
	@Test
	public void test() 
		String jsonStr = JSONObject.toJSONString(person);
		System.out.println("bean to json:" + jsonStr);
		
		//改变json的key为大写
		jsonStr = jsonStr.toUpperCase();
		
		System.out.println("需要转换的json:" + jsonStr);
		person = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Person.class);
		System.out.println("json to bean:" + person.getName());
	


输出如下:

bean to json:"age":"20","desc":"只是一个测试","name":"xianglj"
需要转换的json:"AGE":"20","DESC":"只是一个测试","NAME":"XIANGLJ"
json to bean:null

从上面我们可以看出,当@JSONField作用在Fileld上时,定义了输入和输出,如果我们传输过来的json格式不符合这个格式时,则不能够正确转换。


二、作用在setter和getter方法上

顾名思义,当作用在setter方法上时,就相当于根据 name 到 json中寻找对应的值,并调用该setter对象赋值。

当作用在getter上时,在bean转换为json时,其key值为name定义的值。实例如下:

<pre name="code" class="java">package org.java.json.fastjson.bean;

import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.annotation.JSONField;

public class Product 

	private String productName;
	private String desc;
	private String price;
	
	@JSONField(name="name")
	public String getProductName() 
		return productName;
	
	
	@JSONField(name="NAME")
	public void setProductName(String productName) 
		this.productName = productName;
	
	
	@JSONField(name="desc")
	public String getDesc() 
		return desc;
	
	
	@JSONField(name="DESC")
	public void setDesc(String desc) 
		this.desc = desc;
	
	
	@JSONField(name="price")
	public String getPrice() 
		return price;
	
	
	@JSONField(name="PRICE")
	public void setPrice(String price) 
		this.price = price;
	
	
	public String toString() 
		return JSONObject.toJSONString(this);
	
	



 
package org.java.json.fastjson.json;

import org.java.json.fastjson.bean.Product;
import org.junit.Test;

import com.alibaba.fastjson.JSONObject;

/**
 * 对fastjson中的JSON转换做一个测试
 * @author xianglj
 */
public class JsonObjectTest 

	public static void main(String[] args) 
		Product product = new Product();
		product.setProductName("产品");
		product.setDesc("这是一个产品");
		product.setPrice("22.3");
		
		String jsonStr = JSONObject.toJSONString(product);
		System.out.println("转换为json:" + JSONObject.toJSONString(product));
		
		//jsonStr = jsonStr.toUpperCase();
		System.out.println(jsonStr);
		
		product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);
		System.out.println(product.toString());
	
	
	@Test
	public void test() 
		Product product = new Product();
		product.setProductName("产品");
		product.setDesc("这是一个产品");
		product.setPrice("22.3");
		
		String jsonStr = JSONObject.toJSONString(product);
		System.out.println("转换为json:" + JSONObject.toJSONString(product));
		
		jsonStr = jsonStr.toUpperCase();
		System.out.println(jsonStr);
		
		product = JSONObject.toJavaObject(JSONObject.parseObject(jsonStr), Product.class);
		System.out.println(product.toString());
	


输出如下:

转换为json:"desc":"这是一个产品","name":"产品","price":"22.3"
"DESC":"这是一个产品","NAME":"产品","PRICE":"22.3"
"desc":"这是一个产品","name":"产品","price":"22.3"
有了这个注解之后,我们在转换bean时,就不需要在手工方式,为不能转换的属性进行赋值。即使以后返回数据反生变化,也能够快速的进行修改。不用修改大片代码。只需要修改注解name值就可以了。


这个注解使用就到这里,希望大家喜欢,支持。


fastjson的@jsonfield和jackson的@jsonproperty使用

参考技术A@JSONField作用:在字段和方法上1.Field:@JSONField作用在Field时,name可以定义输入key的名字,反序列化的时值不会赋值到属性上2.作用在setter和getter方法上3.format:用在Date类型的字段来格式化时间格式4.布尔类型:serialize和deseria... 查看详情

fastjson@jsonfield不起作用

参考技术A目录一、JSONField知识点二、解决方法三、参考1.序列化(JavaBean-->json)时配置到对应字段的get()方法上2.反序列化(json-->JavaBean)时配置到对应字段的set()方法上最后使用了Jackson的@JsonProperty解决【1】Springboot使用alibaba的fas... 查看详情

fastjson使用笔记

...n对象对应字段前加注解,这样生成的json也不包含该字段@JSONField(serialize=false) 查看详情

genson和gson,fastjson比有啥优势吗

...程度的入侵,gson使用Expose、Until等注解,fastjson使用的是JSONField、JSONCreator等注解。参考技术Agson和fastjson我都在项目使用过了,相比较而言,gson对字段的处理更细腻一些,有版本号的概念,相对更灵活,值得注意是,gson直接入... 查看详情

ignoreauth注解失效

参考技术A如果注解失效,可能是因为你使用的是fastJson,尝试使用对应的注解来忽略字段,注解为:@JSONField(serialize=false)。 查看详情

fastjson使用手册-排除指定字段(代码片段)

...,"name":"青葱","nickName":"keepgoon"@JSONField注解排除添加@JSONField(serialize=false)注解,serialize(序列化)属性默认为true,使用方式如下:@Datapu 查看详情

fastjson使用手册-排除指定字段(代码片段)

...,"name":"青葱","nickName":"keepgoon"@JSONField注解排除添加@JSONField(serialize=false)注解,serialize(序列化)属性默认为true,使用方式如下:@Datapu 查看详情

日期处理

@JSONField(format="yyyy-MM-ddHH:mm:ss")//FastJson包使用注解 ---后台从库中查询使用@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")//Jackson包使用注解 --后台从库中查询使用@DateTimeFormat(pattern="yyyy-MM-ddHH:m 查看详情

jsonfiled与jsonproperty(代码片段)

@JSONField注解的使用<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.28</version></dependency>FastJson中的注解@JSONField,一 查看详情

时间格式化(代码片段)

1.使用SimpleDateFormat类构造Datedate=newDate();newSimpleDateFormat("yyyy-MM-ddHH:mm:ss").format(date);2.利用fastjson的@JsonField注解@JsonField(format="yyyy-MM-ddHH:mm:ss")privateDatestartTime;3.利用注解@DateTimeFor 查看详情

@jsonfield注解

@JSONField注解作用对象:1.字段2.Setter和Getter方法@JSONField(name="bind_id") privateStringbindId;//这种定义的方法看到网上很多人说,发现bean转json的时候并是"bind_id":xxx的形式,json转bean的时候也不会 查看详情

httpclient.jar和fastjson.jar发生冲突了,怎么解决?两个包都想要

...程度的入侵,gson使用Expose、Until等注解,fastjson使用的是JSONField、JSONCreator等注解。 查看详情

fastjson序列化时过滤字段(属性)的方法总结(代码片段)

...,下面举一些常用的方法。方法一、FastJson的注解@JSONField(serialize=false)privateStringname;  最便捷,直接在实体的字段上加FastJson的注解serialize=false,转JSON字符串时就不会有该字段。方法二、JAVA关键字@JSONFie... 查看详情

通过fastjson将long类型转换成string类型

...,风险比较大。  方法二:使用fastjson的提供的注解,@JSONField(ser 查看详情

@jsonignore注解和@jsonfield(serialize=false)(代码片段)

...码的盐值//TODOaddgettersetters忽略掉,隐藏掉需要的字段@JSONField(serialize=false)例如账号查询时,是不能返回密码字段只需要在密码处加个注解就完美实现了/***密码*/@JSONField(serialize=false)privateStringpassword; 查看详情

springmvc+fastjson之时间类型序列化

时间类型序列化:注意红色代码,必须引入fastjson的JSONField类,而非其它。importcom.alibaba.fastjson.annotation.JSONField;@Entity@Table(name="User")publicclassUser{  @Id  @Column(name="id")  @GeneratedValue(strategy=GenerationType 查看详情

@jsonignore注解和@jsonfield(serialize=false)(代码片段)

@JsonIgnore注解作用:在json序列化时将pojo中的一些属性忽略掉,标记在属性或者方法上,返回的json数据即不包含该属性。@Table(name="tb_user")publicclassUser@Id@GeneratedValue(strategy=GenerationTyp 查看详情

fastjson转换自定义枚举类

...tjava.util.Date;importjava.util.List;importcom.alibaba.fastjson.annotation.JSONField;publicclassProject{/****审核状态*/@JSONFie 查看详情