Json-Jackson和FastJson

狂神: 

测试Jackson

纯Java解决日期格式化

设置ObjectMapper

FastJson:


知乎:Jackson使用指南

1、常见配置

方式一:yml配置

spring.jackson.date-format指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名spring.jackson.time-zone指定日期格式化时区,比如America/Los_Angeles或者GMT+10.spring.jackson.deserialization是否开启Jackson的反序列化spring.jackson.generator是否开启json的generators.spring.jackson.joda-date-time-format指定Joda date/time的格式,比如yyyy-MM-ddHH:mm:ss). 如果没有配置的话,dateformat会作为backupspring.jackson.locale指定json使用的Locale.spring.jackson.mapper是否开启Jackson通用的特性.spring.jackson.parser是否开启jackson的parser特性.spring.jackson.property-naming-strategy指定PropertyNamingStrategy(CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)或者指定PropertyNamingStrategy子类的全限定类名.spring.jackson.serialization是否开启jackson的序列化.spring.jackson.serialization-inclusion指定序列化时属性的inclusion方式,具体查看JsonInclude.Include枚举.
spring:jackson:#日期格式化date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8#设置空如何序列化default-property-inclusion: non_null    serialization:#格式化输出 indent_output: true#忽略无法转换的对象fail_on_empty_beans: falsedeserialization:#允许对象忽略json中不存在的属性fail_on_unknown_properties: falseparser:#允许出现特殊字符和转义符allow_unquoted_control_chars: true#允许出现单引号allow_single_quotes: true

方式二:重新注入ObjectMapper

@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder{ObjectMapper objectMapper = builder.createXmlMapper(false).build();// 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化// Include.Include.ALWAYS 默认// Include.NON_DEFAULT 属性为默认值不序列化// Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量// Include.NON_NULL 属性为NULL 不序列化objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 允许出现特殊字符和转义符objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);// 允许出现单引号objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);// 字段保留,将null值转为""objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>(){@Overridepublic void serialize(Object o, JsonGenerator jsonGenerator,SerializerProvider serializerProvider)throws IOException{jsonGenerator.writeString("");}});return objectMapper;
}

2、常用 API

因为日常开发最常用的api就是对象的序列化和反序列化,这里封装一个工具类,这里只展示部分

API,其他API可参考 JSON解析-Jackson

package com.it.jackson.util;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class JsonUtils {private static ObjectMapper mapper = new ObjectMapper();static {// 对于空的对象转json的时候不抛出错误mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);// 允许属性名称没有引号mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);// 允许单引号mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);// 设置输入时忽略在json字符串中存在但在java对象实际没有的属性mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);// 设置输出时包含属性的风格mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);}/*** 序列化,将对象转化为json字符串** @param data* @return*/public static String toJsonString(Object data) {if (data == null) {return null;}String json = null;try {json = mapper.writeValueAsString(data);} catch (JsonProcessingException e) {log.error("[{}] toJsonString error:{{}}", data.getClass().getSimpleName(), e);}return json;}/*** 反序列化,将json字符串转化为对象** @param json* @param clazz* @param <T>* @return*/public static <T> T parse(@NonNull String json, Class<T> clazz) {T t = null;try {t = mapper.readValue(json, clazz);} catch (Exception e) {log.error(" parse json [{}] to class [{}] error:{{}}", json, clazz.getSimpleName(), e);}return t;}}

测试:

package com.it.jackson.domain;import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {private Long id;private String name;private Integer age;private Date birthday;
}package com.it.jackson.test;import com.it.jackson.domain.User;
import com.it.jackson.util.JsonUtils;
import lombok.extern.slf4j.Slf4j;import java.util.Date;@Slf4j
public class JacksonTest {public static void main(String[] args) {User user = User.builder().id(1L).name("tom").age(23).birthday(new Date()).build();String json = JsonUtils.toJsonString(user);log.info("obj toJsonString:[{}]", json);User u = JsonUtils.parse(json, User.class);log.info("parse json to obj: [{}]", u);}
}16:44:01.871 [main] INFO com.it.jackson.test.JacksonTest - obj toJsonString:[{"id":1,"name":"tom","age":23,"birthday":1587890641047}]
16:44:01.941 [main] INFO com.it.jackson.test.JacksonTest - parse json to obj: [User(id=1, name=tom, age=23, birthday=Sun Apr 26 16:44:01 CST 2020)]

3、常用 注解

3.1、JsonProperty

【@JsonProperty】类似于sql里字段的别名,用于序列化,使用注解字段属性,替代原字段属性

@JsonProperty("userName")
private String name;
序列化结果为:在序列化的json串中,userName替代了name
{"userName":"tom"}

3.2、JsonIgnore

【@JsonIgnore】在序列化时忽略该字段

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {@JsonIgnoreprivate Long id;@JsonProperty("userName")private String name;@JsonIgnoreprivate Integer age;@JsonIgnoreprivate Date birthday;
}序列化结果为:
{"userName":"tom"}

3.3、JsonIgnoreProperties

【@JsonIgnoreProperties】

1、序列化@JsonIgnoreProperties与@JsonIgnore类似,用于类上,注解使用的是字段别名

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties({"id","userName","birthday"})
public class User {private Long id;@JsonProperty("userName")private String name;private Integer age;private Date birthday;
}序列化结果为:
{"age":23}

2、@JsonIgnoreProperties(ignoreUnknown = true)用于忽略字段不匹配情况,相当于

mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

【@JsonTypeName @JsonTypeInfo】用在类上,在序列化时增加一层

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonTypeName(value = "user")
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
public class User {private Long id;@JsonProperty("userName")private String name;private Integer age;private Date birthday;
}序列化结果:{"user":{"id":1,"age":23,"birthday":1587891781603,"userName":"tom"}}

3.4、JsonRootName

【@JsonRootName】

组合在序列化上等于类上注解@JsonRootName(“user”) 和

mapper.enable(SerializationFeature.WRAP_ROOT_VALUE),反序列化无用;

3.5、JsonForma

【@JsonForma】格式化日期格式

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {private Long id;@JsonProperty("userName")private String name;private Integer age;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss:SSS", timezone = "GMT+8")private Date birthday;
}
序列化结果:{"id":1,"age":23,"birthday":"2020-04-26 17:09:32:818","userName":"tom"}

知乎:Jackson解析JSON详细教程

JSON介绍

什么是 JSON ?JSON 是 ”JavaScript Object Notation“ 的缩写,JSON是一种基于文本的格式,

可以把它理解为是一个结构化的数据,这个结构化数据中可以包含键值映射、嵌套对象以及数

组等信息。

Jackson介绍

Jackson和FastJson一样,是一个Java语言编写的,可以进行JSON处理的开源工具库,

Jackson的使用非常广泛,Spring框架默认使用Jackson进行JSON处理。

Jackson有三个核包,分别是Streaming、Databid、Annotations,通过这些包可以方便的对

JSON 进行操作。

Streaming[4]在jackson-core 模块。 定义了一些流处理相关的API以及特定的 JSON 实现。

Annotations[5]在jackson-annotations 模块,包含了 Jackson 中的注解。

Databind[6]在jackson-databind 模块, 在Streaming包的基础上实现了数据绑定,依赖

StreamingAnnotations包。

得益于Jackson高扩展性的设计,有很多常见的文本格式以及工具都有对 Jackson 的相应适配,

如 CSV、XML、YAML 等。

Jackson Maven依赖

在使用 Jackson 时,大多数情况下我们只需要添加jackson-databind依赖项,就可以使用

Jackson功能了,它依赖了下面两个包。

com.fasterxml.jackson.core:jackson-annotations

com.fasterxml.jackson.core:jackson-core

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>

ObjectMapper对象映射器

ObjectMapper是Jackson库中最常用的一个类,使用它可以进行Java对象和JSON字符串之间快

速转换。如果你用过 FastJson,那么Jackson中的ObjectMapper就如同FastJson中的JSON类。

这个类中有一些常用的方法:

readValue() 方法可以进行JSON的反序列化操作,比如可以将字符串、文件流、字节流、字节

数组等将常见的内容转换成 Java 对象。

writeValue() 方法可以进行JSON的序列化操作,可以将Java对象转换成JSON字符串。

大多数情况下,ObjectMapper的工作原理是通过Java Bean对象的Get/Set方法进行转换时映射

的,所以正确编写 Java 对象的Get/Set 方法尤为重要,不过ObjectMapper也提供了诸多配置,

比如可以通过配置或者注解的形式对 Java 对象和 JSON 字符串之间的转换过程进行自定义。这些

在下面部分都会介绍到。

Jackson JSON基本操作

Jackson作为一个Java中的JSON工具库,处理JSON字符串和Java 对象是它最基本最常用的

功能,下面通过一些例子来演示其中的用法。

Jackson JSON序列化

编写一个Person类,定义三个属性,名称、年龄以及技能

/*** @author zhou*/
@Data
public class Person {private String name;private Integer age;private List<String> skillList;
}

将Java对象转换成JSON字符串

import java.util.Arrays;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;/*** @author https://www.wdbyte.com*/
class PersonTest {ObjectMapper objectMapper = new ObjectMapper();@Testpublic void pojoToJsonString() throws JsonProcessingException {Person person = new Person();person.setName("aLng");person.setAge(27);person.setSkillList(Arrays.asList("java", "c++"));String json = objectMapper.writeValueAsString(person);System.out.println(json);}
}

输出的 JSON 字符串:

{"name":"aLng","age":27,"skillList":["java","c++"]}

Jackson甚至可以直接把序列化后的 JSON 字符串写入文件或者读取成字节数组 

mapper.writeValue(new File("result.json"), myResultObject);
// 或者
byte[] jsonBytes = mapper.writeValueAsBytes(myResultObject);
// 或者
String jsonString = mapper.writeValueAsString(myResultObject);

Jackson JSON反序列化

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;/*** @author https://www.wdbyte.com*/
class PersonTest {ObjectMapper objectMapper = new ObjectMapper();@Testvoid jsonStringToPojo() throws JsonProcessingException {String expectedJson = "{\"name\":\"aLang\",\"age\":27,\"skillList\":[\"java\",\"c++\"]}";Person person = objectMapper.readValue(expectedJson, Person.class);System.out.println(person);}
}

输出结果:

Person(name=aLang, age=27, skillList=[java, c++])

JSON转List

上面演示JSON字符串都是单个对象的,如果JSON是一个对象列表那么使用Jackson该怎么处理

呢?已经存在一个文件 PersonList.json 

[{"name": "aLang","age": 27,"skillList": ["java","c++"]},{"name": "darcy","age": 26,"skillList": ["go","rust"]}
]
ObjectMapper objectMapper = new ObjectMapper();@Test
public void fileToPojoList() throws IOException {File file = new File("src/EmployeeList.json");List<Person> personList = objectMapper.readValue(file, new TypeReference<List<Person>>() {});for (Person person : personList) {System.out.println(person);}}

可以输出对象内容:

Person(name=aLang, age=27, skillList=[java, c++])
Person(name=darcy, age=26, skillList=[go, rust])

JSON转Map

JSON 转 Map 在我们没有一个对象的 Java 对象时十分实用,下面演示如何使用 Jackson 把

JSON 文本转成 Map 对象。

ObjectMapper objectMapper = new ObjectMapper();@Test
public void jsonStringToMap() throws IOException {String expectedJson = "{\"name\":\"aLang\",\"age\":27,\"skillList\":[\"java\",\"c++\"]}";Map<String, Object> employeeMap = objectMapper.readValue(expectedJson, new TypeReference<Map>(){});System.out.println(employeeMap.getClass());for (Entry<String, Object> entry : employeeMap.entrySet()) {System.out.println(entry.getKey() + ":" + entry.getValue());}
}

可以看到 Map 的输出结果:

class java.util.LinkedHashMap
name:aLang
age:27
skillList:[java, c++]

Jackson 解析 JSON 详细教程 - 知乎 

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

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

相关文章

深入理解Windows句柄

引言 我们首先需要了解在windows内核中&#xff0c;为了方便管理一些相关的数据结构&#xff0c;Windows统一把它们称之为对象。在Windows内核代码中大量代码都是用C语言编写的。而我们知道在C语言中&#xff0c;并没有纯粹的面向对象&#xff0c;也没有类这一说。因此我们可以…

ArmSoM-W3之RK3588 Debian11详解

1. 简介 RK3588从入门到精通Debian 是⼀种完全⾃由开放并⼴泛⽤于各种设备的 Linux 操作系统。Rockchip在官⽅Debian发⾏版的基础上构建和适配了相关硬件功能 2. 环境介绍 硬件环境&#xff1a; ArmSoM-W3 RK3588开发板 软件版本&#xff1a; OS&#xff1a;ArmSoM-W3 Debia…

WPF 如何让xmal的属性换行显示 格式化

WPF 如何让UI的xmal 按照下面的格式化显示 首先格式化显示在VS中的快捷键是 Ctrl &#xff2b;D 然后需要配置&#xff0c;工具 选项 -文本编辑器 -xmal -格式化-间距 更改成如下就可以了

[2023.09.12]: Yew应用开发的第一个hook--use_state

Yew的SSR模式推荐使用function_component组件&#xff0c;并且在function_component中使用hooks。其中&#xff0c;我使用到的第一个hook是use_state。use_state的设计意图与React中的useState非常相似&#xff0c;都是为了保存并修改当前的状态。然而&#xff0c;由于Yew是用R…

RK3588 点亮imx586摄像头

一.硬件原理图 mipi摄像头硬件确认点&#xff1a; 1.供电&#xff1a;5V&#xff0c;2.8V&#xff0c;1.2V&#xff0c;1.8V&#xff0c;reset脚&#xff08;硬拉3.3&#xff0c;上电的时候从低到高&#xff09;&#xff0c;pwron脚外接 3.3V。 2,时钟&#xff1a;MCLKOUT是2…

Python正则表达式(re)

正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为…

已知平面内三点,求其平面的法向量

三点平面法向量 设三点坐标为A(x1,y1,z1),B(x2,y2,z2),C(x3,y3,z3) 向量AB(x2-x1,y2-y1,z2-z1),AC(x3-x1,y3-y1,z3-z1) AB、AC所在平面的法向量即ABAC(a,b,c),其中&#xff1a; a(y2-y1)(z3-z1)-(z2-z1)(y3-y1) b(z2-z1)(x3-x1)-(z3-z1)(x2-x1) c(x2-x1)(y3-y1)-(x3-x1)(y2-y1)…

JavaScript-DOM实战案例

一、window定时器 1.window定时器方法 有时我们并不想立即执行一个函数&#xff0c;而是等待特定一段时间之后再执行&#xff0c;我们称之为“计划调用&#xff08;scheduling a call&#xff09;”。 目前有两种方式可以实现&#xff1a; setTimeout 允许我们将函数推迟到一…

xen-gic初始化流程

xen-gic初始化流程 调试平台使用的是gic-600&#xff0c;建议参考下面的文档来阅读代码&#xff0c;搞清楚相关寄存器的功能。 《corelink_gic600_generic_interrupt_controller_technical_reference_manual_100336_0106_00_en》 《IHI0069H_gic_architecture_specification》…

【flink进阶】-- Flink kubernetes operator 版本升级

目录 1、检查当前 flink kubernetes operator 版本 2、停止生产上正在运行的 flink job 3、升级 CRD

linux万字图文学习进程信号

1. 信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 1.1 linux中我们常用Ctrlc来杀死一个前台进程 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。2. S…

简单记录一下Splunk ES 升级

1: 背景: 现在有些app 产品对splunk ES (enterprise security) 的版本有要求,这个就要求splunk ES 随着Splunk enterprise 也一起升级,下面先列一下各个版本的兼容: Splunk products version compatibility matrix - Splunk Documentation 下面列出的8.2.11 的版本: 2:…

day38 代码回想录 斐波那契数爬楼梯使用最小花费爬楼梯

大纲 ● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯 509. 斐波那契数 题目&#xff1a;509. 斐波那契数 // 斐波那契数列 // 动规 5部曲 // 1 dp[i]代表i处的斐波那契值 // 2 递归公式&#xff1a;dp[0] 0, dp[1]1, dp[i]dp[i-1]dp[i-2] // 3…

9月16日,每日信息差

今天是2023年09月16日&#xff0c;以下是为您准备的15条信息差 第一、天猫超市首单“茅小凌”已由菜鸟送达&#xff0c;首单已由菜鸟供应链完成履约&#xff0c;18分钟送达消费者手中 第二、软银考虑对OpenAI进行投资。此外&#xff0c;软银还初步拟收购英国人工智能芯片制造…

FE_Vue学习笔记 - 数据代理

Vue中的数据代理是一种机制&#xff0c;通过它&#xff0c;Vue实例&#xff08;vm&#xff09;可以代理其数据对象&#xff08;data&#xff09;中的属性操作。这种代理的原理主要是通过Object.defineProperty()方法&#xff0c;将data对象的每个属性都添加到vm对象上&#xff…

uni-app 实现自定义按 A~Z 排序的通讯录(字母索引导航)

创建 convertPinyin.js 文件 convertPinyin.js 将下面的内容复制粘贴到其中 const pinyin (function() {let Pinyin function(ops) {this.initialize(ops);},options {checkPolyphone: false,charcase: "default"};Pinyin.fn Pinyin.prototype {init: functi…

C语言希尔排序

希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种&#xff0c;也称缩小增量排序&#xff0c;是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序的基本思想是&#xff1a;先将整个待排序的记录序列分割成为若干子序列&#xff08;由…

解决Agora声网音视频在后台没有声音的问题

前言:本文会介绍 Android 与 iOS 两个平台的处理方式 一、Android高版本在应用退到后台时,系统为了省电会限制应用的后台活动,因此我们需要开启一个前台服务,在前台服务中发送常驻任务栏通知,以此来保证App 退到后台时不会被限制活动. 前台服务代码如下: package com.notify…

Limit分页遇到百万级数据该何去何从

一、Limit分页基础 mysql使用查询语句的时候&#xff0c;经常要返回前几条或者中间某几行数据&#xff0c;也就是我们说的分页&#xff0c;语法如下&#xff1a; SELECT * FROM table LIMIT offset,lengthLIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一…

TCP详解之滑动窗口

TCP详解之滑动窗口 引入窗口概念的原因 我们都知道 TCP 是每发送一个数据&#xff0c;都要进行一次确认应答。当上一个数据包收到了应答了&#xff0c; 再发送下一个。 这个模式就有点像我和你面对面聊天&#xff0c;你一句我一句。但这种方式的缺点是效率比较低的。 如果你…