FastJson中@JSONField注解使用
最近做项目中,使用了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进行。
Show me the code:
一、作用Field
@JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。
代码如下:
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) { //没有生效,字段上注解中的name的值为"name",则setter为setName
this.name = NAME;
} public void setAGE(String AGE) { //没有生效,字段上注解中的name的值为"name",则setter为setAge
this.age = AGE;
} public void setDESC(String DESC) { //没有生效,字段上注解中的name的值为"name",则setter为setDesc
this.desc = DESC;
} public String toString() {
return JSONObject.toJSONString(this);
}
}
输出如下:
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定义的值。实例如下:
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") //测试代码中对jsonStr有一个toUpperCase的操作。就会这与"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);
} }
import org.java.json.fastjson.bean.Product;
import org.junit.Test; import com.alibaba.fastjson.JSONObject; /**
* 对fastjson中的JSON转换做一个测试
*/
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值就可以了。
这个注解使用就到这里,希望大家喜欢,支持
http://blog.csdn.net/u011425751/article/details/51219242
fastjson是一款由阿里巴巴提供的性能出色的json序列化与反序列化库,而且使用很方便,我们可以使用JSON.toJSONString(object)将一个对象序列化为json格式,但是如果我们不想把一个类的所有成员都序列化怎么办呢。
解决这个问题有两种方式:
1.给不想被序列化的属性增加transient属性---java特性
2.给不想被序列化的属性增加增减JSONField(serialize=false)---fastjson特性
友情提醒一下:
由于fastjson低版本存在反序列化漏洞,建议大家用较新版本,至少在1.2.28版本以上吧
---------------------
作者:johnHuster
来源:CSDN
原文:https://blog.csdn.net/john1337/article/details/76276073
版权声明:本文为博主原创文章,转载请附上博文链接!
作用:在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
使用方法:一般标记在属性或者方法上,返回的json数据即不包含该属性。
场景模拟:
需要把一个List<HistoryOrderBean>转换成json格式的数据传递给前台。但实体类中基本属性字段的值都存储在快照属性字段中。此时我可以在业务层中做处理,把快照属性字段的值赋给实体类中对应的基本属性字段。最后,我希望返回的json数据中不包含这两个快照字段,那么在实体类中快照属性上加注解@JsonIgnore,那么最后返回的json数据,将不会包含goodsInfo和extendsInfo两个属性值。
public class HistoryOrderBean {
//基本属性字段
private String insurantName;
private String insuranceName;
private String insurancePrice;
private String insurancePicture;
private String insuranceLimit;
//快照属性字段
@JsonIgnore
private String goodsInfo; //快照基本信息
@JsonIgnore
private String extendsInfo; //快照扩展属性信息
}
4.注解失效:
如果注解失效,可能是因为你使用的是fastJson,尝试使用对应的注解来忽略字段,注解为:@JSONField(serialize = false),使用方法一样。
---------------------
作者:fakerswe
来源:CSDN
原文:https://blog.csdn.net/fakerswe/article/details/78626085
版权声明:本文为博主原创文章,转载请附上博文链接!
FastJson中@JSONField注解使用的更多相关文章
- fastjson的@JSONField注解的一点问题
@JSONField 看源码它可以作用于字段和方法上. 引用网上说的, 一.作用Field @JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称. 但是 ...
- fastjson的@JSONField注解
@JSONField作用:在字段和方法上1.Field:@JSONField作用在Field时,name可以定义输入key的名字,反序列化的时 值不会赋值到属性上2.作用在setter和getter方 ...
- Fastjson妙用之@JSONField注解
在开发的过程中使用json格式的地方非常多,现在前后端分离的项目中,前后端数据交换的格式一般为json,这种格式的优/缺点这里不再赘述,感兴趣的可以百度.把java中的实体类序列化为json的方式也有 ...
- @JSONField注解的使用
FastJson中的注解@JSONField,一般作用在get/set方法上面,常用的使用场景有下面三个: 修改和json字符串的字段映射[name] 格式化数据[format] 过滤掉不需要序列化的 ...
- spring中RequestBody注解接收参数时用JSONField转参数名无效问题
问题: 在springboot项目中使用@RequestBody注解接收post请求中body里的json参数的情况.即: @RequestMapping(value = "/get-use ...
- fastjson简单使用demo,@JSONField注解属性字段上与set、get方法上。实体类toString(),实体类转json的区别;_下划线-减号大小写智能匹配
一.demo代码 @JSONField注解属性字段上与set.get方法上.使用@Data注解(lombok插件安装最下方),对属性“笔名”[pseudonym]手动重写setter/getter方法 ...
- 【FastJSON】解决FastJson中“$ref 循环引用”的问题
0.开发环境 SSH,EasyUI,MySQL 1.需求要求: (1)首先获取所有的贷款订单数据,即List <LoanOrder>. (2)然后从单个贷款订单实体LoanOrder去访问 ...
- fastjson中对象转化为字符串时过滤某字段
fastjson中对象转化为字符串时过滤某字段,有两种方法: 一.在该字符定义上方添加"@JSONField(serialize=false)"注解: 二.调用含有Property ...
- @JSONField 注解说明
转自:https://blog.csdn.net/suyimin2010/article/details/80617538 导入@JSONField 注解: import com.alibaba.fa ...
随机推荐
- JavaScript之面向对象学习一
1.通过Object构造函数和对象字面量来创建对象缺点:使用同一个接口创建很多的对象,会产生大量的重复代码.比如我需要创建人的对象,并且需要三类人,医生.工程师.老师,他们可以抽象出很多属性,比如姓名 ...
- JavaSE思维导图(七)
- 全面修复IE,注册IE所有dll
全面修复IE,注册IE所有dll 复制,粘贴到文本文档里,保存成.bat文件,双击运行. rundll32.exe advpack.dll /DelNodeRunDLL32 %systemroot%\ ...
- 升级python的sqlite库版本
今天了解了一下用python获取chrome cookie信息,在研究的过程中,发现打开数据库失败,后来调查了一下发现是由于sqlite3库太老的缘故,起码需要3.8以上,然后看了一下python 2 ...
- BHO启动IE调试
如下图选择Web Browser Debugger, 输入启动网址
- Svn服务启动的两种方式
一.svn服务器启动 cmd命令行启动:vsvnserve -d –r 文档仓库路径 -d 后台执行 -r 版本库的根目录 二.Windows服务自动启动 利用xp.2000 以上的 ...
- [转]WIN7系统安装Apache 提示msvcr110.DLL
我的系统是WIN7 64位,安装配置Apache2.4.7(httpd-2.4.7-win64-VC11.zip )提示如下错误 VC++2012 2013 百度网盘地址:http://pan.bai ...
- codeforces 510E. Fox And Dinner 网络流
题目链接 给出n个人, 以及每个人的值, 要求他们坐在一些桌子上面, 每个桌子如果有人坐, 就必须做3个人以上. 并且相邻的两个人的值加起来必须是素数.每个人的值都>=2. 由大于等于2这个条件 ...
- Python数据分析扩展库
Anaconda和Python(x,y)都自带了下面的这些库. 1. NumPy 强大的ndarray和ufunc函数. import numpy as np xArray = np.ones((3, ...
- XHProf 初探
XHProf是一个分层PHP性能分析工具.它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况.一个函数的开销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调 ...