FastJson中@JSONField注解使用

FastJson中@JSONField注解使用最近做项目中,使用了json格式在服务器之间进行数据传输。但是发现json格式数据不符合JAVA中的变量定义规则,并且难以理解,因此需要在后台中做二次处理,将数据处理成我们系统中定义的格式。思路:   1.定义需要返回的bean,bean中定义需要返回的数据    2.获取到需要处理的JSON字符串   3.将JSON字符串转换为bean,再将转换后的bean返回给客

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

最近做项目中,使用了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);
	}
}

Jetbrains全家桶1年46,售后保障稳定

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值就可以了。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200800.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQL语句中创建表的语句_用sql创建表

    SQL语句中创建表的语句_用sql创建表mysql创建表的sql语句mysql建表常用sql语句:连接:mysql-h主机地址-u用户名-p用户密码(注:u与root可以不用加空格,其它也一样)断开:exit(回车)创建授权:grantselecton数据库.*to用户名@登录主机identifiedby”密码”修改密码:mysqladmin-u用户名-p旧密码password新密码删除授权:revo…

    2022年10月17日
    2
  • jenkins自定义构建参数_git将本地新建的分支提交到远程

    jenkins自定义构建参数_git将本地新建的分支提交到远程前言当我们的自动化项目越来越多的时候,在代码仓库会提交不同的分支来管理,在用jenkins来构建的时候,我们希望能通过参数化构建git仓库的分支。下载安装GitParameter插件系统管理-

    2022年7月29日
    11
  • pycharm django环境搭建_IDEA如何创建项目

    pycharm django环境搭建_IDEA如何创建项目Django是比较经典的Pythonweb框架,最近刚好在项目中用到了Django,临阵磨枪学了下,这里先总结下如何用Pycharm创建一个Django项目。1首先来说下和Javaweb框架的一些不同个人感觉:使用Javaweb框架的时候,在与数据库进行数据交互时,其实需要写一些SQL语句的,但是使用Django框架,直接通过配置,以及models中的getfilter方法调用,就…

    2022年8月29日
    3
  • 软件工程NS图_软件工程软件结构图怎么画

    软件工程NS图_软件工程软件结构图怎么画一、实验目的(1)熟悉常用的详细设计表达工具(2)掌握利用visio等CASE工具设计程序流程图,NS图,PAD图的画法(3)掌握利用visualstudio等IDE完成实现代码的编写和调试二、实验内容从以下几个程序要求中任选其中的一个进行详细设计和编码实现。1) 求一组数组中的最大数,数组表示为A(n),n=自然数1,2……。2) 对输入的两个正整数a和b求其最大公约数,1<=a,b<=100003) 对输入的两个正整数a和b求其最小公倍数,1<=a,b&lt

    2022年8月13日
    3
  • 同步调用、回调和异步调用区别

    同步调用、回调和异步调用区别同步调用是以一种阻塞式调用比如说:古代的长城的烽火传递信息,现在我们假设每个烽火只能看到相邻的烽火状态,每个烽火的状态只有亮和暗。现在有A、B、C、D四个烽火,A首先点亮,B看到A的烽火亮了,立马去点火,花了2秒点亮。但是这时候负责C烽火的人在睡觉,可是这时候所有人都在等待C点亮,终于C睡了2个小时候看到了B点亮,然后去点亮。D由于长期没有点亮,导致烽火出现问题,因此整个过程都在等待D的完

    2022年7月27日
    23
  • pytorch学习笔记(十):MLP[通俗易懂]

    pytorch学习笔记(十):MLP[通俗易懂]文章目录1.隐藏层2.激活函数2.1ReLU函数2.2sigmoid函数2.3tanh函数3多层感知机4.代码实现MLP4.1获取和读取数据4.2定义模型参数4.3定义激活函数4.4定义模型4.5定义损失函数4.6训练模型小结1.隐藏层多层感知机(multilayerperceptron,MLP)在单层神经网络的基础上引入了一到多个隐藏层(hiddenlayer)。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐

    2022年6月16日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号