Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,本节为大家介绍Jackson的基础核心用法,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。

本篇文章中为大家介绍,一些特殊JOSN数据格式处理-JSON框架Jackson精解第2篇:

  • 一、从URL读取JSON数据
  • 二、Unknow Properties 赋值失败处理
  • 三、未赋值Java Bean序列化
  • 四、日期格式化

一、从URL读取JSON数据

Jackson不仅可以将字符串反序列化为 Java POJO对象,还可以请求远程的API,获得远程服务的JSON响应结果,并将其转换为Java POJO对象。

@Test
void testURL() throws IOException { URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); //远程服务URL
ObjectMapper mapper = new ObjectMapper();
//从URL获取JSON响应数据,并反序列化为java 对象
PostDTO postDTO = mapper.readValue(url, PostDTO.class); System.out.println(postDTO); }
  • jsonplaceholder.typicode.com 是一个免费提供HTTP测试服务的网站,我们可以利用它进行测试
  • 远程服务API返回结果是一个JSON字符串,一篇post稿件包含userId,id,title,content属性
  • PostDTO 是我们自己定义的java 类,同样包含userId,id,title,content成员变量

下文是控制台打印输出结果,postDTO的toString()方法输出。

PostDTO(userId=1, id=1, title=sunt aut facere repellat provident occaecati excepturi optio reprehenderit, body=quia et suscipit
suscipit recusandae consequuntur expedita et cum
reprehenderit molestiae ut ut quas totam
nostrum rerum est autem sunt rem eveniet architecto)

二、Unknow Properties 赋值失败处理

有的时候,客户端提供的JSON字符串属性,多于我们服务端定义的java 类的成员变量。

比如上图中的两个类,

  • 我们先将PlayerStar序列化为JSON字符串,包含age属性
  • 然后将JSON字符串转换为PlayerStar2,不包含age属性
@Test
void testUnknowProperties() throws IOException {
ObjectMapper mapper = new ObjectMapper();
PlayerStar player = PlayerStar.getInstance(); //为PlayerStar 各属性赋值,可以参考本系列文章第一篇 //将PlayerStar序列化为JSON字符串
String jsonString = mapper.writeValueAsString(player);
System.out.println(jsonString);
//将JSON字符串反序列化为PlayerStar2对象
PlayerStar2 player2 = mapper.readValue(jsonString, PlayerStar2.class);
System.out.println(player2);
}

当进行反序列化的时候,会抛出下面的异常。这是因为JSON字符串所包含的属性,多余Java类的定义(多出一个阿age,赋值时找不到setAge方法)。

{"age":45,"playerName":"乔丹"}

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "age" (class com.example.demo.javabase.PlayerStar2), not marked as ignorable (one known property: "playerName"])
at [Source: (String)"{"age":45,"playerName":"乔丹"}"; line: 1, column: 10] (through reference chain: com.example.demo.javabase.PlayerStar2["age"])

如果我们想忽略掉age属性,不接受我们的java类未定义的成员变量数据,可以使用下面的方法,就不会抛出UnrecognizedPropertyException了。

ObjectMapper mapper = new ObjectMapper();
mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

三、未赋值Java Bean序列化

有的时候,我们明知道某些类的数据可能为空,我们通常也不会为它赋值。但是客户端就是需要这个{}的JSON对象,我们该怎么做?

public class MyEmptyObject {
private Integer i; //没有get set方法
}

我们可以为ObjectMapper设置disable序列化特性:FAIL_ON_EMPTY_BEANS,也就是允许对象的所有属性均未赋值。

@Test
void testEmpty() throws IOException { ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); String jsonString = mapper.writeValueAsString(new MyEmptyObject());
System.out.println(jsonString); }

默认情况下不做设置,会抛出下面的异常InvalidDefinitionException。设置disable序列化特性:FAIL_ON_EMPTY_BEANS之后,会序列化为{}字符串。

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.demo.jackson.JacksonTest1$MyEmptyObject and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

四、日期格式化

日期格式化,是我们JSON序列化与反序列化过程中比较常见的需求

ObjectMapper mapper = new ObjectMapper();
Map temp = new HashMap();
temp.put("now", new Date());
String s = mapper.writeValueAsString(temp);
System.out.println(s);

默认情况下,针对java中的日期及相关类型,Jackson的序列化结果如下

{"now":1600564582571}

如果我们希望在JSON序列化及反序列化过程中,日期格式化,需要做如下的处理

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); //注意这里
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd")); //注意这里
Map temp = new HashMap();
temp.put("now", new Date()); String s = mapper.writeValueAsString(temp);
System.out.println(s);

控制台打印输出结果如下:

{"now":"2020-09-20"}

欢迎关注我的博客,里面有很多精品合集

  • 本文转载注明出处(必须带连接,不能只转文字):字母哥博客

觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。

URL及日期等特殊数据格式处理-JSON框架Jackson精解第2篇的更多相关文章

  1. 属性序列化自定义与字母表排序-JSON框架Jackson精解第3篇

    Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...

  2. @JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  3. JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法

    Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...

  4. SpringBoot(2) Json框架 -- Jackson返回结果处理

    一.常用框架 阿里 fastjson,谷歌gson等 JavaBean序列化为Json,性能:Jackson > FastJson > Gson > Json-lib 同个结构 Ja ...

  5. Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  6. 天气API整理,返回的数据格式为json对象

    中国天气的API惨遭封杀,不得已更换其他的API使用吧. 这里大部分API来自APP的数据包截取或者反汇编,所以各开发使用者不得用于商业用途,否则后果自负! 1.金山网址导航 来源:http://ww ...

  7. API设计中响应数据格式用json的优点

    通常我们再设计api返回时,都使用json格式返回,相比xml,他又有什么优点呢? 更直观易懂 占用空间更小 能与JavaScript跟好的兼容.js通过eval()进行Json读取. 支持多种语言. ...

  8. GSON转换日期数据为特定的JSON数据

    通过JSON传递数据的时候经常需要传递日期,Java中可以通过GSON将日期转换为特定格式的JSON数据. 1.普通的GSON转换日期 public void query(HttpServletReq ...

  9. js的数据格式之json

    //json数据格式语法:1 数据在名称/值对中2 数据由逗号分隔3 花括号保存对象4 方括号保存数组 详情请查看:js的数据格式之json

随机推荐

  1. ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值

    ES6--变量的解构赋值 引言 正文 一.数组的解构赋值 解构失败 不完全解构 默认值 二.对象的解构赋值 三.字符串的解构赋值 结束语 引言 变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量 ...

  2. Jmeter 常用函数(16)- 详解 __split

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.htm 作用 根据分隔符分割传递给它的字符串 语法格式 ...

  3. Jmeter 常用函数(12)- 详解 __machineName

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 返回机器(电脑)名称 语法格式 ${_ ...

  4. Promise 解析

    Promise 由于js的语言特性(用户交互)和工作环境(浏览器脚本),决定了它是单线程工作,所以两段脚本不能同时运行,但为了实现功能,所以人们使用了事件和回调来初步解决这个问题,例如(addEven ...

  5. linux 修改 mac

    ifconfig eth0 hw ether fa::3d:c3:: 或 ip link set dev eth0 address fa::3d:c3::

  6. A neural reinforcement learning model for tasks with unknown time delays

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 我们提出了一个基于生物学的神经模型,能够在复杂的任务中执行强化学习.该模型的独特之处在于,它能够在一个动作.状态转换和奖 ...

  7. 尝试写一写4gl与4fd

    4gl DATABASE ds   GLOBALS "../../config/top.global"   DEFINE g_curs_index           LIKE t ...

  8. 揭秘!containerd 镜像文件丢失问题,竟是镜像生成惹得祸

    导语 作者李志宇,腾讯云后台开发工程师,日常负责集群节点和运行时相关的工作,熟悉 containerd.docker.runc 等运行时组件.近期在为某位客户提供技术支持过程中,遇到了 contain ...

  9. Unity 移动平台自己编写Shader丢失问题

    问题一:使用AB加载资源,资源中包含有第三方shader,加载出的资源出现shader丢失的显示问题 这是因为Unity在打包的时候,会进行资源精简,默认情况下,是不会将第三方shader打包进入包体 ...

  10. Arbitrary-Oriented Object Detection with Circular Smooth Label(ECCV2020,旋转目标检测)

    论文链接:https://arxiv.org/abs/2003.05597 code:https://github.com/Thinklab-SJTU/CSL_RetinaNet_Tensorflow ...