• Json-Jackson和FastJson


    狂神: 

    测试Jackson

    纯Java解决日期格式化

    设置ObjectMapper

    FastJson:


    知乎:Jackson使用指南

    1、常见配置

    方式一:yml配置

    1. spring.jackson.date-format指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名
    2. spring.jackson.time-zone指定日期格式化时区,比如America/Los_Angeles或者GMT+10.
    3. spring.jackson.deserialization是否开启Jackson的反序列化
    4. spring.jackson.generator是否开启json的generators.
    5. spring.jackson.joda-date-time-format指定Joda date/time的格式,比如yyyy-MM-ddHH:mm:ss). 如果没有配置的话,dateformat会作为backup
    6. spring.jackson.locale指定json使用的Locale.
    7. spring.jackson.mapper是否开启Jackson通用的特性.
    8. spring.jackson.parser是否开启jackson的parser特性.
    9. spring.jackson.property-naming-strategy指定PropertyNamingStrategy(CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)或者指定PropertyNamingStrategy子类的全限定类名.
    10. spring.jackson.serialization是否开启jackson的序列化.
    11. spring.jackson.serialization-inclusion指定序列化时属性的inclusion方式,具体查看JsonInclude.Include枚举.
    12. spring:
    13. jackson:
    14. #日期格式化
    15. date-format: yyyy-MM-dd HH:mm:ss
    16. time-zone: GMT+8
    17. #设置空如何序列化
    18. default-property-inclusion: non_null
    19. serialization:
    20. #格式化输出
    21. indent_output: true
    22. #忽略无法转换的对象
    23. fail_on_empty_beans: false
    24. deserialization:
    25. #允许对象忽略json中不存在的属性
    26. fail_on_unknown_properties: false
    27. parser:
    28. #允许出现特殊字符和转义符
    29. allow_unquoted_control_chars: true
    30. #允许出现单引号
    31. allow_single_quotes: true

    方式二:重新注入ObjectMapper

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

    2、常用 API

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

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

    1. package com.it.jackson.util;
    2. import com.fasterxml.jackson.annotation.JsonInclude;
    3. import com.fasterxml.jackson.core.JsonParser;
    4. import com.fasterxml.jackson.core.JsonProcessingException;
    5. import com.fasterxml.jackson.databind.DeserializationFeature;
    6. import com.fasterxml.jackson.databind.ObjectMapper;
    7. import com.fasterxml.jackson.databind.SerializationFeature;
    8. import lombok.NonNull;
    9. import lombok.extern.slf4j.Slf4j;
    10. @Slf4j
    11. public class JsonUtils {
    12. private static ObjectMapper mapper = new ObjectMapper();
    13. static {
    14. // 对于空的对象转json的时候不抛出错误
    15. mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
    16. // 允许属性名称没有引号
    17. mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    18. // 允许单引号
    19. mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
    20. // 设置输入时忽略在json字符串中存在但在java对象实际没有的属性
    21. mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    22. // 设置输出时包含属性的风格
    23. mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    24. }
    25. /**
    26. * 序列化,将对象转化为json字符串
    27. *
    28. * @param data
    29. * @return
    30. */
    31. public static String toJsonString(Object data) {
    32. if (data == null) {
    33. return null;
    34. }
    35. String json = null;
    36. try {
    37. json = mapper.writeValueAsString(data);
    38. } catch (JsonProcessingException e) {
    39. log.error("[{}] toJsonString error:{{}}", data.getClass().getSimpleName(), e);
    40. }
    41. return json;
    42. }
    43. /**
    44. * 反序列化,将json字符串转化为对象
    45. *
    46. * @param json
    47. * @param clazz
    48. * @param
    49. * @return
    50. */
    51. public static T parse(@NonNull String json, Class clazz) {
    52. T t = null;
    53. try {
    54. t = mapper.readValue(json, clazz);
    55. } catch (Exception e) {
    56. log.error(" parse json [{}] to class [{}] error:{{}}", json, clazz.getSimpleName(), e);
    57. }
    58. return t;
    59. }
    60. }

    测试:

    1. package com.it.jackson.domain;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Builder;
    4. import lombok.Data;
    5. import lombok.NoArgsConstructor;
    6. import java.util.Date;
    7. @Data
    8. @Builder
    9. @NoArgsConstructor
    10. @AllArgsConstructor
    11. public class User {
    12. private Long id;
    13. private String name;
    14. private Integer age;
    15. private Date birthday;
    16. }
    17. package com.it.jackson.test;
    18. import com.it.jackson.domain.User;
    19. import com.it.jackson.util.JsonUtils;
    20. import lombok.extern.slf4j.Slf4j;
    21. import java.util.Date;
    22. @Slf4j
    23. public class JacksonTest {
    24. public static void main(String[] args) {
    25. User user = User.builder()
    26. .id(1L)
    27. .name("tom")
    28. .age(23)
    29. .birthday(new Date())
    30. .build();
    31. String json = JsonUtils.toJsonString(user);
    32. log.info("obj toJsonString:[{}]", json);
    33. User u = JsonUtils.parse(json, User.class);
    34. log.info("parse json to obj: [{}]", u);
    35. }
    36. }
    37. 16:44:01.871 [main] INFO com.it.jackson.test.JacksonTest - obj toJsonString:[{"id":1,"name":"tom","age":23,"birthday":1587890641047}]
    38. 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里字段的别名,用于序列化,使用注解字段属性,替代原字段属性

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

    3.2、JsonIgnore

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

    1. @Data
    2. @Builder
    3. @NoArgsConstructor
    4. @AllArgsConstructor
    5. public class User {
    6. @JsonIgnore
    7. private Long id;
    8. @JsonProperty("userName")
    9. private String name;
    10. @JsonIgnore
    11. private Integer age;
    12. @JsonIgnore
    13. private Date birthday;
    14. }
    15. 序列化结果为:
    16. {"userName":"tom"}

    3.3、JsonIgnoreProperties

    【@JsonIgnoreProperties】

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

    1. import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
    2. import com.fasterxml.jackson.annotation.JsonProperty;
    3. import lombok.AllArgsConstructor;
    4. import lombok.Builder;
    5. import lombok.Data;
    6. import lombok.NoArgsConstructor;
    7. import java.util.Date;
    8. @Data
    9. @Builder
    10. @NoArgsConstructor
    11. @AllArgsConstructor
    12. @JsonIgnoreProperties({"id","userName","birthday"})
    13. public class User {
    14. private Long id;
    15. @JsonProperty("userName")
    16. private String name;
    17. private Integer age;
    18. private Date birthday;
    19. }
    20. 序列化结果为:
    21. {"age":23}

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

    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

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

    1. import com.fasterxml.jackson.annotation.JsonProperty;
    2. import com.fasterxml.jackson.annotation.JsonTypeInfo;
    3. import com.fasterxml.jackson.annotation.JsonTypeName;
    4. import lombok.AllArgsConstructor;
    5. import lombok.Builder;
    6. import lombok.Data;
    7. import lombok.NoArgsConstructor;
    8. import java.util.Date;
    9. @Data
    10. @Builder
    11. @NoArgsConstructor
    12. @AllArgsConstructor
    13. @JsonTypeName(value = "user")
    14. @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
    15. public class User {
    16. private Long id;
    17. @JsonProperty("userName")
    18. private String name;
    19. private Integer age;
    20. private Date birthday;
    21. }
    22. 序列化结果:
    23. {"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】格式化日期格式

    1. @Data
    2. @Builder
    3. @NoArgsConstructor
    4. @AllArgsConstructor
    5. public class User {
    6. private Long id;
    7. @JsonProperty("userName")
    8. private String name;
    9. private Integer age;
    10. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss:SSS", timezone = "GMT+8")
    11. private Date birthday;
    12. }
    13. 序列化结果:
    14. {"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

    1. com.fasterxml.jackson.core
    2. jackson-databind
    3. 2.13.3

    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类,定义三个属性,名称、年龄以及技能

    1. /**
    2. * @author zhou
    3. */
    4. @Data
    5. public class Person {
    6. private String name;
    7. private Integer age;
    8. private List skillList;
    9. }

    将Java对象转换成JSON字符串

    1. import java.util.Arrays;
    2. import com.fasterxml.jackson.core.JsonProcessingException;
    3. import com.fasterxml.jackson.databind.ObjectMapper;
    4. import org.junit.jupiter.api.Assertions;
    5. import org.junit.jupiter.api.Test;
    6. /**
    7. * @author https://www.wdbyte.com
    8. */
    9. class PersonTest {
    10. ObjectMapper objectMapper = new ObjectMapper();
    11. @Test
    12. public void pojoToJsonString() throws JsonProcessingException {
    13. Person person = new Person();
    14. person.setName("aLng");
    15. person.setAge(27);
    16. person.setSkillList(Arrays.asList("java", "c++"));
    17. String json = objectMapper.writeValueAsString(person);
    18. System.out.println(json);
    19. }
    20. }

    输出的 JSON 字符串:

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

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

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

    Jackson JSON反序列化

    1. import com.fasterxml.jackson.core.JsonProcessingException;
    2. import com.fasterxml.jackson.databind.ObjectMapper;
    3. import org.junit.jupiter.api.Assertions;
    4. import org.junit.jupiter.api.Test;
    5. /**
    6. * @author https://www.wdbyte.com
    7. */
    8. class PersonTest {
    9. ObjectMapper objectMapper = new ObjectMapper();
    10. @Test
    11. void jsonStringToPojo() throws JsonProcessingException {
    12. String expectedJson = "{\"name\":\"aLang\",\"age\":27,\"skillList\":[\"java\",\"c++\"]}";
    13. Person person = objectMapper.readValue(expectedJson, Person.class);
    14. System.out.println(person);
    15. }
    16. }

    输出结果:

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

    JSON转List

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

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

    1. [
    2. {
    3. "name": "aLang",
    4. "age": 27,
    5. "skillList": [
    6. "java",
    7. "c++"
    8. ]
    9. },
    10. {
    11. "name": "darcy",
    12. "age": 26,
    13. "skillList": [
    14. "go",
    15. "rust"
    16. ]
    17. }
    18. ]
    1. ObjectMapper objectMapper = new ObjectMapper();
    2. @Test
    3. public void fileToPojoList() throws IOException {
    4. File file = new File("src/EmployeeList.json");
    5. List personList = objectMapper.readValue(file, new TypeReference>() {});
    6. for (Person person : personList) {
    7. System.out.println(person);
    8. }
    9. }

    可以输出对象内容:

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

    JSON转Map

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

    JSON 文本转成 Map 对象。

    1. ObjectMapper objectMapper = new ObjectMapper();
    2. @Test
    3. public void jsonStringToMap() throws IOException {
    4. String expectedJson = "{\"name\":\"aLang\",\"age\":27,\"skillList\":[\"java\",\"c++\"]}";
    5. Map employeeMap = objectMapper.readValue(expectedJson, new TypeReference(){});
    6. System.out.println(employeeMap.getClass());
    7. for (Entry entry : employeeMap.entrySet()) {
    8. System.out.println(entry.getKey() + ":" + entry.getValue());
    9. }
    10. }

    可以看到 Map 的输出结果:

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

    Jackson 解析 JSON 详细教程 - 知乎 

  • 相关阅读:
    QT学习笔记-QT访问各种关系数据库笔记汇总
    SpringBoot——自定义start
    SQL Server事务隔离级别
    rsync远程同步
    shiro回话管理
    图像处理:模糊图像判断
    Python进阶复习-自带库
    AI写真教程:Stable Diffusion 之 IPAdapter-FaceId
    部署docker仓库harbor
    代码随想录day56|583. 两个字符串的删除操作|72. 编辑距离|编辑距离总结篇|Golang
  • 原文地址:https://blog.csdn.net/ZHOU_VIP/article/details/132943617