首页 > 其他分享 >jackson序列化(jackson codec)

jackson序列化(jackson codec)

时间:2024-07-23 21:40:11浏览次数:14  
标签:Jackson 对象 Person JSON codec jackson 序列化

Jackson 是一个用于 Java 平台的开源 JSON 库,它提供了灵活且高效的方式来处理 JSON 数据的序列化(Java对象 → JSON字符串)和反序列化(JSON 字符串→ Java对象)。

以下是 Jackson 的一些主要特点和功能:

  1. 高性能:Jackson 通过使用基于流的处理模型和性能优化技术,提供了出色的性能。它支持快速的数据绑定和处理大型 JSON 数据。

  2. 灵活性:Jackson 支持多种数据格式,包括 JSON、Smile(二进制 JSON 格式)和 XML。它可以处理复杂的对象关系和嵌套结构,并支持自定义序列化和反序列化规则。

  3. 注解支持:Jackson 提供了一系列注解(如 @JsonProperty@JsonIgnore@JsonFormat 等)来控制序列化和反序列化的行为。通过注解,你可以指定字段名称、忽略特定字段、格式化日期和时间等。

  4. 支持泛型和多态:Jackson 支持序列化和反序列化泛型类型,以及处理多态类型的对象。它提供了类型擦除解决方案和多态类型的标记(如 @JsonTypeInfo@JsonSubTypes 等)。

  5. 可定制性:Jackson 提供了丰富的配置选项和可扩展的 API,使你能够根据需求进行定制。你可以自定义序列化器和反序列化器,注册模块扩展功能,以及处理特定的数据转换和验证逻辑。

  6. 整合性:Jackson 可以与各种 Java 框架和库进行无缝集成,如 Spring、Hibernate、JAX-RS 等。它可以轻松地与其他库一起使用,以提供全面的数据处理解决方案。

 

Spring MVC 默认使用 Jackson 库进行 JSON 的序列化和反序列化,无需额外的配置。

当你返回一个对象时,Spring MVC 将自动使用 Jackson 库将该对象序列化为 JSON 字符串,并将其作为响应的主体返回给客户端。

同样地,当你使用 @RequestBody 注解标记的方法参数时,Spring MVC 将使用 Jackson 库将请求体中的 JSON 数据反序列化为对应的 Java 对象。

 

SpringBoot项目自动依赖了 Jackson 库。 非SpringBoot项目,使用 Jackson 库,可能需要在项目中添加 Jackson 库依赖。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.5</version>
</dependency>
View Code

 

 

 

下面是一个使用 Jackson 库进行对象序列化和反序列化的示例

package jstudy.jackson;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;

/**
 * 使用 Jackson 库进行对象序列化和反序列化的示例类
 */
public class JacksonSerializationDemo {

    public static void main(String[] args) {
        // 创建一个 ObjectMapper 对象
        ObjectMapper objectMapper = new ObjectMapper();

        // 创建一个示例对象
        Person person = new Person("John Doe", 30);

        try {
            // 对象序列化为 JSON 字符串
            String json = objectMapper.writeValueAsString(person);
            System.out.println("Serialized JSON: " + json);

            // JSON 字符串反序列化为对象
            Person deserializedPerson = objectMapper.readValue(json, Person.class);
            System.out.println("Deserialized Person: " + deserializedPerson);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

    @Data
    static class Person {
        private String name;
        private Integer age;
        private String address;

        // 必须提供默认构造函数,以便 Jackson 库能够实例化对象
        public Person() {
        }

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

    }
}

 

代码运行结果:

Serialized JSON: {"name":"John Doe","age":30,"address":null}
Deserialized Person: JacksonSerializationDemo.Person(name=John Doe, age=30, address=null)

BTW,上面示例类  JacksonSerializationDemo 可以rename为 JacksonCodecDemo

"Codec" 一词通常用于指代编码器-解码器(Encoder-Decoder)或编码-解码(Encode-Decode)的概念。将示例重命名为 "JacksonCodecDemo" 可以更准确地表达其涵盖了序列化和反序列化的功能。

通过将示例命名为 "JacksonCodecDemo",强调了 Jackson 库不仅实现了对象到 JSON 的序列化(即编码)功能,还具备将 JSON 转换回对象的反序列化(即解码)功能。

这种重命名方式能够更清晰地传达代码示例的目的。

日常开发中,我们也要关注命名。良好的命名规范是高质量代码的基石之一。在 Java 中,命名规范不仅帮助保持代码的整洁性和一致性,还能极大地提高代码的可读性和可维护性。

 

如何控制 Jackson 在序列化对象时不包含全是 null 的字段?

要在 Jackson 中避免序列化全是 null 的字段,你可以使用 Jackson 的配置选项来控制序列化行为。

以下是两种常用的方法:

1. 使用 ObjectMapper 的 setSerializationInclusion 方法设置序列化包含规则为 JsonInclude.Include.NON_NULL。这意味着只有非空字段才会被序列化,而全是 null 的字段将被忽略。

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonSerializationDemo {

    public static void main(String[] args) {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        // ... 省略其他代码 ...
    }
}

 

2. 使用 @JsonInclude 注解在类级别设置序列化包含规则为 JsonInclude.Include.NON_NULL。这将仅对被注解的类有效。

import com.fasterxml.jackson.annotation.JsonInclude;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Person {
    // ... 省略其他代码 ...
}

 

  BTW,我司系统是前后端分离模式,为提高开发效率,我们约定给前端页面所提供的后端接口,只返回明确需要的字段。例如:企业客户信息,后端有一个 EnterpriseVO,包含了企业的基本信息和资质信息。不过,查询企业客户基本信息API、查询企业客户资质信息API,不能返回 EnterpriseVO 的所有字段。此时,要满足这个就可以用上面的 Jackson不序列化null字段的方式来解决。      

标签:Jackson,对象,Person,JSON,codec,jackson,序列化
From: https://www.cnblogs.com/buguge/p/18319711

相关文章

  • 无法序列化 HighLevelGraph 类型的对象
    我编写的代码如下,importdask.arrayasdafromdistributedimportClientremote_server='localhost:8786'client=Client(remote_server)rows,cols=4123,4123chunk_rows,chunk_cols=1024,1024matrix1=da.random.random(size=(rows,cols),chun......
  • Gson的基本使用:解析Json格式数据 序列化与反序列化
    目录一,Gson和Json1,Gson2,Json3,Gson处理对象的几个重要点4,序列化和反序列化二,Gson的使用1,Gson的创建2,简单对象序列化3,对象序列化,格式化输出日期4,嵌套对象序列化5,对象数组序列化6,对象集合序列化一,Gson和Json1,Gson        Gson是Google发布的一个Java库,可......
  • DRF如何反序列化json?
    我使用React作为前端,django作为后端。我使用fetchAPI向服务器发送POST请求。数据通过JSON.stringify()传递。该请求将被Django中的视图拦截,数据可在视图函数的请求参数中获取。至少这是我所理解的。现在,当我访问request.body时,我惊讶地得到了一个字典。......
  • python反序列化
    之前hgame中遇到python反序列化,这次正好借分享会来尽可能详细学习一下python反序列化基础知识什么是序列化?反序列化?在很多时候为了方便对象传输,我们往往会把一些内容转化成更方便存储、传输的形式。我们把“对象->字符串”的翻译过程称为“序列化”;相应地,把“字符串->对......
  • UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\xb5‘ in position
    报错UnicodeEncodeError是由于文件写入过程中编码格式不匹配导致的。为了避免这种问题,可以显式指定使用UTF-8编码来写入文件。以下是修改后的代码,确保在写入HTML文件时使用UTF-8编码:importnumpyasnpimportpandasaspdfromsklearn.datasetsimportload_iri......
  • 掌握Python中的文件序列化:Json和Pickle模块解析
    Python文件操作与管理:Open函数、Json与Pickle、Os模块在Python中,文件是一个重要的数据处理对象。无论是读取数据、保存数据还是进行数据处理,文件操作都是Python编程中不可或缺的一部分。本文将详细介绍Python中文件操作的几种常用方法,包括open函数的使用、数据序列化与反......
  • 【序列化和反序列化】
    序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,这通常意味着将对象转换为字节流,以便可以将其保存到磁盘上或通过网络传输到另一个网络节点。相反,反序列化(Deserialization)是将已序列化的数据恢复为对象的过程。序列化的基本概念为了能......
  • java基础学习:序列化之 - kryo
    文章目录一、介绍二、特点三、使用方式四、应用场景五、注意事项一、介绍Kryo是一个快速且高效的Java序列化框架,它主要用于将Java对象转换为字节流以便存储或传输,同时能够将字节流反序列化为原始Java对象。Kryo相比Java自带的序列化机制具有更高的性能和更小的序列化......
  • java基础学习:序列化之 - ObjectMapper
    文章目录一、介绍二、主要功能三、使用方法官网:一、介绍ObjectMapper是Jackson库中的一个核心类,用于在Java对象和JSON数据之间进行转换。Jackson是一个流行的Java库,用于处理JSON数据。它提供了灵活的方式来序列化和反序列化Java对象,即将Java对象转换......
  • RMI反序列化-流程分析
    参考教程视频Java反序列化RMI专题-没有人比我更懂RMI参考博客RMI反序列化初探JAVA安全基础(四)--RMI机制-先知社区(aliyun.com)RMI反序列化漏洞之三顾茅庐-流程分析RMI应用概述参考RMI应用概述RMIClient首先去rmiregistry注册中心查找,RMIServer开启的端口。之后......