Jackson 的@JsonRawValue

1. 概述

Jackson 提供了丰富的注解集合,用于定制 Java 对象的序列化和反序列化过程。其中一个特别有用的注解是@JsonRawValue,它允许在序列化的输出中嵌入预先格式化的 JSON 内容。本文将通过一个学生管理系统实例来探讨这个注解的应用。

@JsonRawValue 注解概览

Jackson 的@JsonRawValue 注解指示库将 Java 属性作为原始 JSON 序列化,而不进行进一步处理。这在属性已经包含格式化的 JSON 字符串,并且希望直接嵌入到最终的序列化 JSON 中时特别有用。

2. 开发步骤

  • 创建新 Maven 项目:建立一个新的 Maven 项目。
  • 添加必要的 Jackson 依赖:引入所需的 Jackson 依赖项。
  • 设计 Student 类:使用@JsonRawValue 注解。
  • 构建序列化类:创建处理对象到 JSON 转换的类。
  • 通过主方法展示功能:演示注解的功能。

3. 创建 Maven 项目

创建简单的 Maven 项目可以通过以下几种方式:

  • 使用命令行接口
  • 使用 Eclipse IDE
  • 使用 IntelliJ IDEA

4. Maven 依赖项

pom.xml 文件中添加如下 Jackson 数据绑定依赖项:

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

5. 代码示例

Student.java
java 复制代码
import com.fasterxml.jackson.annotation.JsonRawValue;

public class Student {
    private int id;
    private String name;
    
    // 假设这个字段包含了表示学生成绩的格式化 JSON 字符串
    @JsonRawValue
    private String grades;

    public Student(int id, String name, String grades) {
        this.id = id;
        this.name = name;
        this.grades = grades;
    }

    // Getters and setters...
    public int getId() { return id; }
    public String getName() { return name; }
    public String getGrades() { return grades; }
}
StudentSerializer.java
java 复制代码
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class StudentSerializer {
    public static String serialize(Student student) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.writeValueAsString(student);
    }
}
MainClass.java
java 复制代码
public class MainClass {
    public static void main(String[] args) {
        // 嵌入成绩的原始 JSON 字符串
        Student student = new Student(101, "John Doe", "{\"math\": 90, \"english\": 85}");
        try {
            String json = StudentSerializer.serialize(student);
            System.out.println("序列化的 JSON: " + json);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }
}

输出结果将会是:

json 复制代码
{"id":101,"name":"John Doe","grades":{"math": 90, "english": 85}}
代码解释

在我们的 Student 类中,grades 属性被@JsonRawValue 注解标记。这指示 Jackson 在序列化输出中嵌入该属性的字符串值作为原始 JSON,而不会进一步引用或转义它。

StudentSerializer 类使用 Jackson 的 ObjectMapper 来处理序列化。

MainClass 展示了注解的功能,通过创建一个 Student 对象并将其序列化。输出展示了 grades 的原始 JSON 表示。

6. 结论

Jackson 的@JsonRawValue 注解提供了一种优雅的解决方案,可以将预先存在的 JSON 字符串嵌入到序列化输出中,提供了灵活性和便利性。这确保了预格式化的 JSON 内容保持不变,在序列化结果中保留其结构。这对于需要嵌入完整、复杂的 JSON 片段的情况非常有用,例如嵌入外部 API 返回的数据或者保持特定 JSON 格式的响应。

相关推荐
她说..3 小时前
MySQL 与 Java 的 JSON 数据处理
java·mysql·json·springboot
牛油果子哥q1 天前
C++对接LLM完整工程:异步HTTP请求、JSON解析、超时容错、重连兜底
c++·http·json
小刘在重生~1 天前
Django|Ajax 入门、JSON 返回、ECharts 图表、文件上传完整笔记
ajax·django·json
谢斯3 天前
[unity]如何在unity中添加newtonsoft-json
unity·json·游戏引擎
2601_962066934 天前
短视频批量制作怎么做?2026年用 huasheng-cli 的 --json 与退出码,一张选题表批量出片
json·音视频
oliver_sys_log5 天前
老项目 json-lib 2.4 JSONTokener 精度丢失问题排查
json
IT_Octopus5 天前
JSON 日志里的 `{“$ref“:“$.xxx“}`:从 fastjson 兼容包到原生 fastjson2 的迁移实录
开发语言·python·json
数据狐(Datafox)5 天前
mercadolibre.item_get 工程实战:美客多商品详情API技术解析与落地应用
java·人工智能·mysql·json
Fcy6485 天前
Linux下 应⽤层⾃定义协议与序列化(JSON方法)
linux·json
半亩码田6 天前
C#转Python第4.4篇:JSON 处理:json 模块 vs System.Text.Json
python·c#·json