最近做项目中,使用了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的名称,同时也定义了输出的名称。

代码如下:

importcom.alibaba.fastjson.JSONObject;importcom.alibaba.fastjson.annotation.JSONField;public classPerson {

@JSONField(name="name")privateString name;

@JSONField(name="age")privateString age;

@JSONField(name="desc")privateString desc;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getAge() {returnage;

}public voidsetAge(String age) {this.age =age;

}publicString getDesc() {returndesc;

}public voidsetDesc(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;

}publicString toString() {return JSONObject.toJSONString(this);

}

}

importorg.java.json.fastjson.bean.Person;importorg.junit.Before;importorg.junit.Test;importcom.alibaba.fastjson.JSONObject;public classPersonTest {privatePerson person;/*** 初始化对象*/@Beforepublic voidsetUp() {

person= newPerson();

person.setName("xianglj");

person.setAge("20");

person.setDesc("只是一个测试");

}

@Testpublic voidtest() {

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定义的值。实例如下:

importcom.alibaba.fastjson.JSONObject;importcom.alibaba.fastjson.annotation.JSONField;public classProduct {privateString productName;privateString desc;privateString price;

@JSONField(name="name")publicString getProductName() {returnproductName;

}

@JSONField(name="NAME")public voidsetProductName(String productName) {this.productName =productName;

}

@JSONField(name="desc")publicString getDesc() {returndesc;

}

@JSONField(name="DESC") //测试代码中对jsonStr有一个toUpperCase的操作。就会这与"DESC"匹配

public voidsetDesc(String desc) {this.desc =desc;

}

@JSONField(name="price")publicString getPrice() {returnprice;

}

@JSONField(name="PRICE")public voidsetPrice(String price) {this.price =price;

}publicString toString() {return JSONObject.toJSONString(this);

}

}

importorg.java.json.fastjson.bean.Product;importorg.junit.Test;importcom.alibaba.fastjson.JSONObject;/*** 对fastjson中的JSON转换做一个测试*/

public classJsonObjectTest {public static voidmain(String[] args) {

Product product= newProduct();

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());

}

@Testpublic voidtest() {

Product product= newProduct();

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转换成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

版权声明:本文为博主原创文章,转载请附上博文链接!

java jsonfield_FastJson中@JSONField注解使用相关推荐

  1. java jsonfield_FastJson 使用@JSONField注解和@JSONCreator指定构造方法

    在某些应用场景下,如果需要定制序列化输出,比如说,希望序列化采用之后采用"ID",而不是"id",就可以使用@JSONField这个注解. @JSONField ...

  2. java ee中javamail注解_JavaEE之注解

    1注解:Annotation注解,是一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次,给计算机,JVM提供解读信息的. 2注解的作用:编译检查:代码分析,编 ...

  3. java中注解的解析_【Java】中的注解与注解解析器

    /** * 该注解描述了作用范围 * java RetentionPolicy.SOURCE * java+class RetentionPolicy.CLASS * java+class+jvm R ...

  4. java jsonfield_fastjson使用-- @JSONField使用(转)

    @JSONField可以配置到字段和方法上,那不同的配置有什么不同呢?下面我们就来看看具体配置到不同的方法上. 我们在创建实体类的时候,都要求属性必须创建get和set方法,否则fastjson将不会 ...

  5. java aliasfor_Spring中@AliasFor注解的三种用法

    查看Spring中的@AliasFor的文档,英文描述如下: Usage Scenarios Explicit aliases within an annotation: within a singl ...

  6. Java和Android中的注解

    转载自  Java和Android中的注解 1.引言 从JDK1.5开始,引入了注解类Annotation,Annotation其实是一种接口,可以作用于类.方法.属性等等 ,它可以通过反射机制来访问 ...

  7. 【java】详解java中的注解(Annotation)

    目录结构: contents structure [+] 什么是注解 为什么要使用注解 基本语法 4种基本元注解 重复注解 使用注解 运行时处理的注解 编译时处理的注解 1.什么是注解 用一个词就可以 ...

  8. JSONField 注解的使用

    package com.example.springboot;import com.alibaba.fastjson.JSON; import org.junit.jupiter.api.Test;i ...

  9. java中@JSONField和@JsonProperty注解有什么区别呢?

    下文笔者讲述Java中@JSONField和@JsonProperty的不同之处,如下所示: 今天在springboot的开发中, 可以使用 @JSONField可正常转换但@JsonProperty ...

最新文章

  1. jboss5+EJB3+MDB Queue
  2. 小程序框架之wepy报错问题
  3. 如何把SAP Kyma和SAP Cloud for Customer连接起来
  4. LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)
  5. 休闲甜品店创业计划书_甜品店创业计划书
  6. 私塾在线《深入浅出学 Hadoop- 初级 部分》
  7. RPM常用命令及RPM中文手册
  8. 【js逆向爬虫】-有道翻译js逆向实战
  9. Yagmail通过QQ邮箱发送邮件实例
  10. Unity中访问GameCenter的实现
  11. 智能优化算法之灰狼优化算法(GWO)的实现(Python附源码)
  12. Confluence使用教程-不古出品
  13. html 滚动字幕如何设置,如何制作滚动字幕 视频画面加滚动字幕,自己设置滚动字幕的显示时间(滚动次数)...
  14. skywalking plugin 开发初探 ONS plugin 实践
  15. Maven无法从nexus私服下载依赖?
  16. Spring Security 入门 Remember-Me 记住我功能
  17. 【U8+】总账期初余额开账按钮是灰色的
  18. 广西大学计算机调剂信息2021,广西大学2021年考研可调剂的专业和人数一览
  19. 2020java面试题,找不到工作来找我(二)
  20. 软件培训机构的网络营销那点事儿

热门文章

  1. 跨学科知识和实战经验#学习小组招募
  2. four///////
  3. SSH远程登录ubuntu
  4. win运行java程序端口号被占用,强制关闭
  5. 上拉电阻和下拉电阻的选择
  6. shell编程100例
  7. linux 解压为其他名字,Linux 命令————打包解压之tar
  8. 2020年DeFi行业观察:交易型DeFi格局初定,下一战场是数据型、商品型与游戏型DeFi...
  9. vue全局变量、全局方法
  10. springboot2整合redis的两种使用方式