JSON字符串封装成Bean对象/JSON串反序列化成实体类对象/JSON字符串转换成Java对象

文章目录

  • 使用阿里巴巴的 JSON
  • 使用 ObjectMapper
  • JSON字段与实体类属性不一致

首先,我们建立一个实体类,这里简单定义了 name、sex、age 三个属性,以及 get、set、tostring方法。

public class Student {private String name;private String sex;private Integer age;public String getName() {return name;}public String getSex() {return sex;}public Integer getAge() {return age;}public void setName(String name) {this.name = name;}public void setSex(String sex) {this.sex = sex;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", sex=" + sex + ", age=" + age + "]";}
}

使用阿里巴巴的 JSON

依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version>
</dependency>

JSON串的字段少于实体类的字段,实体类对象中没有匹配到的属性被赋予默认值:

@Testpublic void testFastjson01() {String jsonStr = "{\"age\":18,\"name\":\"zhangsan\"}";Student stu = JSON.parseObject(jsonStr, Student.class);System.out.println(stu); // Student [name=zhangsan, sex=null, age=18]}

JSON串的字段多于实体类的字段:

 @Testpublic void testFastjson02() {String jsonStr = "{\"age\":20,\"name\":\"lisi\",\"sex\":\"男\",\"hobby\":\"basketball\"}";Student stu = JSON.parseObject(jsonStr, Student.class);System.out.println(stu); // Student [name=lisi, sex=男, age=20]}

上面 JSON 串中的 \" 可以替换成单引号:

    String jsonStr = "{'id':001,'model':'A09','picUrl':'x001.jpe','description':'非常便宜','price':20}";

使用 ObjectMapper

依赖:

<dependency><groupId>com.konghq</groupId><artifactId>unirest-objectmapper-jackson</artifactId><version>4.0.0-RC4</version>
</dependency>

JSON串的字段少于实体类的字段,实体类对象中没有匹配到的属性被赋予默认值:

 @Testpublic void testJackson01() throws Exception{String jsonStr = "{\"age\":18,\"name\":\"zhangsan\"}";ObjectMapper om = new ObjectMapper();Student stu = om.readValue(jsonStr, Student.class);System.out.println(stu); // Student [name=zhangsan, sex=null, age=18]}

JSON串的字段多于实体类的字段,会报错:

 @Testpublic void testJackson02() throws Exception{String jsonStr = "{\"age\":20,\"name\":\"lisi\",\"sex\":\"男\",\"hobby\":\"basketball\"}";ObjectMapper om = new ObjectMapper();Student stu = om.readValue(jsonStr, Student.class);System.out.println(stu);}

错误信息:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "hobby" (class com.cyj.demo03.Student), not marked as ignorable (3 known properties: "name", "sex", "age"])at [Source: {"age":20,"name":"lisi","sex":"男","hobby":"basketball"}; line: 1, column: 44] (through reference chain: com.cyj.demo03.Student["hobby"])at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51)at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:817)at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:958)at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1324)at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1302)at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:249)at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136)at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3564)at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2580)at com.cyj.demo03.TestJson.testJackson02(TestJson.java:40)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

由此可见,在默认情况下,ObjectMapper是不支持json串的字段多于实体类字段的,但是,ObjectMapper也提供了解决方案,我们在实体类上,添加注解 @JsonIgnoreProperties,这个注解有一个ignoreUnknown属性,默认值为false,我们可以将它改为true,这样jackson在反序列化的时候,就会忽略掉不存在的属性了。

@JsonIgnoreProperties(ignoreUnknown = true)
public class Student {

JSON字段与实体类属性不一致

项目开发过程中,有时候可能要对接第三方平台,可能就会存在字段名不一样的问题,而双方的字段名不一致, 而代码开发已经有一段时间勒,如果就因为字段名不一样的问题,双方改成属性名一致,这样改动量太大,也不保险,下面我来接手一下,针对这种场景,如果解决。

假设: 系统通过http对接,传的是json。有一个参数"名称"

第三方平台:name

开发环境:userName

直接通过实体类映射,不用说肯定有问题。

在实体类的属性上增加一个注解就可以解决这种问题:

@JsonProperty("name")
private String userName;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

端到端的地址翻译(虚拟地址是怎样取到相应高速缓存的数据的?)

【0】写在前面-为什么需要虚拟存储器? 0.1&#xff09;定义&#xff1a;虚拟存储器其实就是借用了磁盘地址空间&#xff0c;还记得当初我们安装CentOS&#xff0c;划分的swap 文件系统吗&#xff1f; 0.2&#xff09;VM简化了链接和加载、代码和数据共享&#xff0c;以及应用…

python gevent教程_Python的gevent框架的入门教程

Python通过yield提供了对协程的基本支持&#xff0c;但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。gevent是第三方库&#xff0c;通过greenlet实现协程&#xff0c;其基本思想是&#xff1a;当一个greenlet遇到IO操作时&#xff0c;比如访问网络&#xff0c…

qa/qc_专业QA如何实施可靠的CI / CD管道?

qa/qc过时的传统软件开发方法并不能接管不断升级的市场趋势&#xff0c;并且这些方法缺乏解决方案&#xff0c;无法解决引入“ 持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09; ”的快速软件发布需求的增长。 除了CI / CD之外&#xff0c;您还需要具有…

程序员分类

1.优秀的debug能力 10K程序员&#xff1a;实现功能就不错了 20K程序员&#xff1a;编程我最牛&#xff0c;debug&#xff1f;我不太会&#xff01; 30K程序员&#xff1a;编程有点慢&#xff0c;debug快速搞定&#xff0c;回家睡觉&#xff01; 40K程序员&#xff1a;基本不写…

三菱q系列plc连接电脑步骤_三菱Q系列PLC与三菱变频器的CC-link通讯技术(我的学习笔记)...

三菱变频器可以通过CC-LINK的接线进行控制&#xff08;但需要另购买选件FR-A7NC&#xff0c;这选件是与变频器配套的通讯适配器&#xff0c;插在三菱变频器的选件插槽中&#xff09;&#xff0c;从而可以减少接线提高效率减少错误&#xff0c;接CC-LINK只需4根线就可以完全控制…

react提交数据到数据库_React型关系数据库事务

react提交数据到数据库Spring Framework最近宣布将提供对React式事务管理的支持 。 让我们深入研究它对R2DBC&#xff08;SQL数据库访问的React式规范&#xff09;如何工作。 事务管理是一种模式&#xff0c;而不是特定于技术的。 从这个角度来看&#xff0c;它的属性和运行时…

实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)

【-1】写在前面&#xff1a; 以下部分内容总结于 http://blog.csdn.net/ruyanhai/article/details/7181842 complementary: 兼容性是指运行在前期CPU&#xff0c;如8086/8088上的的程序&#xff0c;也可以运行在其以后的处理器&#xff0c;如80286上&#xff1b; 【0】看看in…

Windows 记事本的 ANSI、Unicode、UTF-8 这三种编码模式有什么区别?

先来解释一下这三种编码的历史吧&#xff1a; ANSI&#xff1a;最早的时候计算机ASCII码只能表示256个符号&#xff08;含控制符号&#xff09;&#xff0c;这个字符集表示英文字母足够&#xff0c;其中&#xff0c;我们键盘上可见的符号的编码范围是从32到126&#xff08;大小…

python编程、abc最大值_Python中abc

import abc指定metaclass属性将类设置为抽象类&#xff0c;抽象类本身只是用来约束子类的&#xff0c;不能被实例化class Animal(metaclassabc.ABCMeta): # 统一所有子类的方法abc.abstractmethod # 该装饰器限制子类必须定义有一个名为talk的方法def say(self):print(‘动物基…

(实模式+保护模式)模式切换的过程步骤(代码+文字解析)

【0】写在前面 文末的个人总结是干货&#xff0c;前面代码仅供参考的&#xff0c;且source code from orange’s implemention of a os. ; ; pmtest2.asm ; 编译方法&#xff1a;nasm pmtest2.asm -o pmtest2.com ; %include "pm.inc" ; 常量, 宏, 以及一些说…

骆驼(camel)命名法_Apache Camel 3 –骆驼核心vs骆驼核心引擎(较小的核心)

骆驼(camel)命名法Camel团队目前正在忙于Apache Camel 3的开发。已经完成了许多工作&#xff0c;到目前为止&#xff0c;我们已经发布了3个里程碑版本。 下一个里程碑版本4具有一些出色的新创新功能&#xff0c;这些功能我将在接下来的几个月中发布。 该博客的主题是我们在将骆…

Maven的依赖插件

文章目录mvn dependency:copy-dependenciesmvn dependency:treemvn dependency:listmvn dependency:copy-dependencies 导出项目所依赖的所有 jar 包&#xff0c;默认导出到 target/dependency 目录中。 1.第一种方式 在命令终端中&#xff0c;进入 pom.xml 所在的目录&…

安装telnet_Flask干货:Memcached缓存系统——Memcached的安装

图 | 源网络文 | 5号程序员Memcached缓存系统是目前使用最广泛的高性能分布式内存缓存系统&#xff0c;是一个自由开源的高性能分布式内存对象缓存系统。国内外众多大型互联网应用都选择Memcached以提高网站的访问性能。缓存系统一般可以将一些不需要实时更新但是又极其消耗数据…

jep和jsr_候选JEP:记录和密封类型

jep和jsr马克莱因霍尔德&#xff08;Mark Reinhold &#xff09;本周在OpenJDK琥珀色开发者邮件列表上宣布了两个新的紧密相关的候选 JDK增强提案&#xff08; JEP&#xff09; &#xff0c;其帖子分别为“ 新候选JEP&#xff1a;359&#xff1a;记录&#xff08;预览&#xff…

局部描述符表LDT的作用+定义+初始化+跳转相关

【0】写在前面 0.1&#xff09;本代码的作用&#xff1a; 旨在说明局部描述符表的作用&#xff0c;及其相关定义&#xff0c;初始化和跳转等内容&#xff1b; 0.2&#xff09;文末的个人总结是干货&#xff0c;前面代码仅供参考的&#xff0c;且source code from orange’s i…

ServletContext的学习笔记(属Servlet学习课程)

文章目录ServletContext 简介获取 ServletContext 对象功能获取 MIME 类型用来共享数据获取文件在服务器主机的物理路径获取全局级别的初始化参数获取临时目录ServletContext 简介 web 服务器在启动时&#xff0c;会为每一个已经部署的应用创建唯一的一个 ServletContext 实例…

开发罪过_七大罪过与如何避免

开发罪过在整个本文中&#xff0c;我将在代码片段中使用Java&#xff0c;同时还将使用JUnit和Mockito 。 本文旨在提供以下测试代码示例&#xff1a; 难以阅读 难以维护 在这些示例之后&#xff0c;本文将尝试提供替代方法&#xff0c;这些替代方法可用于增强测试的可读性&…

调用门的定义+调用

【0】写在前面 0.1&#xff09;本代码&#xff0c;添加了门描述符的相关代码&#xff0c;旨在说明 怎样 对门转移的目标段 进行定义&#xff0c;调用&#xff1b;0.2&#xff09;本文 只对 与 门相关的 代码进行简要注释&#xff0c;言简意赅&#xff1b;0.3&#xff09;文末总…

小学生图片_中秋节手抄报,小学生中秋节手抄报图片大全

月饼&#xff0c;或叫中秋饼&#xff0c;是东亚各地的中秋节食品&#xff0c;越南称为饼中秋(Bnhtrungthu)。中秋节吃月饼的习俗于唐朝开始&#xff0c;北宋之时&#xff0c;月饼被称为“宫饼”&#xff0c;在宫廷内流行&#xff0c;也流传到民间&#xff0c;俗称“小饼”和“月…

Response的学习笔记(属Servlet学习课程)

文章目录Response设置响应消息数据1.设置响应行2.设置响应头3.设置响应体案例1.重定向2.输出字符数据到 Response 对象乱码的问题解决办法一解决办法二3.输出字节数据到 Response 对象4.验证码案例继承与实现体系Response 该对象的功能就是用来设置响应消息&#xff08;响应报…