首页 > 编程语言 >深入解析@JsonValue注解在Java序列化中的应用

深入解析@JsonValue注解在Java序列化中的应用

时间:2024-08-12 08:54:32浏览次数:14  
标签:JsonValue Java -- System println 注解 序列化

深入解析@JsonValue注解在Java序列化中的应用

在Java开发中,对象序列化是一个常见的需求,尤其是在进行网络通信或者数据持久化时。Jackson库作为Java领域内一个非常流行的JSON处理库,提供了强大的序列化和反序列化功能。在Jackson 2.9版本之后,@JsonValue注解的引入,为开发者提供了一种更为灵活的方式来控制序列化输出。

@JsonValue注解简介

@JsonValue注解用于标记一个无参方法,该方法的返回值将作为序列化时的单一值,而不是收集对象的所有属性。通常,该注解应用于返回简单标量类型的方法,如String或Number,但也可以使用任何可序列化的类型。此外,从2.9版本开始,@JsonValue注解也可以直接应用于字段。

实例分析

使用@JsonValue注解的方法

假设我们有一个Person类,我们希望在序列化时只输出姓名和年龄的组合信息。我们可以通过以下方式实现:

public class Person {
    private String name;
    private int age;

    // 构造函数、getter和setter省略

    @JsonValue
    public String toPersonInfo() {
        return name + " - " + age;
    }
}

ExampleMain类中,我们创建了一个Person对象,并使用ObjectMapper进行序列化:

public class ExampleMain {
    public static void main(String[] args) throws IOException {
        Person person = new Person("Jessie", 35);
        System.out.println("-- before serialization --");
        System.out.println(person);
        ObjectMapper om = new ObjectMapper();
        String jsonString = om.writeValueAsString(person);
        System.out.println("-- after serialization --");
        System.out.println(jsonString);
    }
}

输出结果为:

-- before serialization --
Person{name='Jessie', age=35}
-- after serialization --
"Jessie - 35"

使用@JsonValue注解的字段

如果我们希望直接在字段上使用@JsonValue注解,可以这样定义Person2类:

public class Person2 {
    @JsonValue
    private String personInfo;

    // 构造函数、getter和setter省略
}

ExampleMain2类中,我们创建了一个Person2对象,并进行序列化:

public class ExampleMain2 {
    public static void main(String[] args) throws IOException {
        Person2 person = new Person2("Jessie", 35);
        System.out.println("-- before serialization --");
        System.out.println(person);
        ObjectMapper om = new ObjectMapper();
        String jsonString = om.writeValueAsString(person);
        System.out.println("-- after serialization --");
        System.out.println(jsonString);
    }
}

输出结果与使用方法时相同。

技术栈

  • jackson-databind: 2.9.6版本,Jackson的核心数据绑定功能库。
  • JDK: 10版本,Java开发工具包。
  • Maven: 3.5.4版本,项目管理和构建自动化工具。

通过上述分析,我们可以看到@JsonValue注解提供了一种非常灵活的方式来控制Java对象的序列化行为,使得我们可以更加精确地定义序列化输出的内容。这在需要定制化序列化输出格式的场景下非常有用。

标签:JsonValue,Java,--,System,println,注解,序列化
From: https://blog.csdn.net/m0_62153576/article/details/141116772

相关文章

  • 【Java数据结构】---泛型
    乐观学习,乐观生活,才能不断前进啊!!!我的主页:optimistic_chen我的专栏:c语言,Java欢迎大家访问~创作不易,大佬们点赞鼓励下吧~文章目录包装类装箱和拆箱泛型泛型语法擦除机制泛型的上届泛型方法静态泛型方法完结包装类在Java中,由于基本类型不是继承自Objec......
  • 方法的调用(JAVA)
    方法之间允许相互调用,不需要知道方法的具体的实现,实现重用,提高效率。 1.静态方法用静态方法        用静态方法时通过类名.方法名的方法进行调用,当在同一类中时,直接通过方法名进行调用。2.静态方法调用非静态方法        同一个类中,通过对象来调用。 ......
  • 基于Java的考试信息报名系统 SpringBoot考试报名管理系统 Vue前后端分离【Java毕业设
    ⛄博主介绍:⚡全栈开发工程师,精通Web前后端技术、数据库、架构设计。专注于Java技术领域和小程序领域的开发,毕业设计、课程设计项目中主要包括定制化开发、源代码、代码讲解、文档报告辅导、安装调试等。✅文末获取联系✅目录1项目介绍 2技术选型 3系统总体设计 4......
  • 对象数组(JAVA)
    例:定义包含3个元素的对象数组,数据类型为Person,并用for遍历输出Person类publicclassPerson{publicintage;publicStringname;publicPerson(intage,Stringname){this.age=age;this.name=name;}}Test类publicclassTe......
  • 冒泡排序(JAVA)
    冒泡排序的过程排序次数是外层循环(5-1)交换次数是内层循环(5-i-1)importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intarr[]=newint[5];inttemp;System.out.println("请输入5名学生的成绩......
  • JAVA监听屏幕内容
    以下是一个使用Java监听屏幕内容的示例代码:importjava.awt.AWTException;importjava.awt.Robot;importjava.awt.Rectangle;importjava.awt.Toolkit;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjavax.imageio.......
  • 【待看】一周一深入之深入剖析PHP反序列化phar、session、soap反序列化
    引言接上个文章,一周一深入之深入剖析PHP反序列化上个文章把php反序列化的基础以及trick总结完了,这篇文章就总结一下PHP常见的三个组件反序列化,Phar、session、soap反序列化。一周一深入之深入剖析PHP反序列化phar、session、soap反序列化引言一、什么是Phar以及Phar反序列化Phar......
  • 计算机毕业设计 校园失物招领网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解
    ......
  • SpringBoot整合支付宝沙箱支付流程(干货·精简版)Java毕业设计亮点 通俗易懂
    ......
  • 5.Java方法
    什么是方法Java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合。方法包含于类或对象中。方法在程序中被创建,在其他地方被调用。设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子......