springboot项目中取消转义功能方案@JsonRawValue

发布于:2025-09-13 ⋅ 阅读:(139) ⋅ 点赞:(0)

@JsonRawValue 是 Jackson 库提供的一个注解,用于在 JSON 序列化和反序列化过程中,对特定字段进行特殊处理。以下从它的使用场景、使用方法、注意事项等方面进行详细介绍:

使用场景

  • 原始 JSON 字符串嵌入
    当一个 Java 对象的某个字段值本身就是一个 JSON 格式的字符串,希望在序列化时,该字符串以原始 JSON 片段的形式嵌入到最终的 JSON 结果中,而不是被当成普通字符串处理(被转义或添加引号),此时就可以使用 @JsonRawValue。例如,后端从其他服务获取到一个 JSON 格式的字符串数据,需要直接传递给前端,就可以在对应的实体类字段上使用该注解。
  • 保留特殊字符格式
    如果字符串中包含换行符 \n、制表符 \t 等特殊字符,且在序列化时不希望这些字符被转义(如 \n 变成 \n ),让前端能获取到原始格式的字符串,@JsonRawValue 也能发挥作用。

使用方法

定义包含 @JsonRawValue 注解的实体类

import com.fasterxml.jackson.annotation.JsonRawValue;

public class JsonRawValueExample {
    private int code;
    private String message;
    // 使用 @JsonRawValue 注解,让 data 字段在序列化时按原始内容处理
    @JsonRawValue
    private String data;

    public JsonRawValueExample(int code, String message, String data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

进行序列化操作

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        // 情况一:data 是 JSON 格式字符串
        String jsonData = "{\"name\":\"Tom\",\"age\":25}";
        JsonRawValueExample example1 = new JsonRawValueExample(200, "Success", jsonData);

        // 情况二:data 包含换行符
        String textWithNewline = "第一行\n第二行\n第三行";
        JsonRawValueExample example2 = new JsonRawValueExample(200, "Success", textWithNewline);

        ObjectMapper objectMapper = new ObjectMapper();
        // 序列化 example1
        String result1 = objectMapper.writeValueAsString(example1);
        System.out.println("情况一序列化结果:" + result1);
        // 序列化 example2
        String result2 = objectMapper.writeValueAsString(example2);
        System.out.println("情况二序列化结果:" + result2);
    }
}

上述代码运行后,输出结果如下

情况一序列化结果:{"code":200,"message":"Success","data":{"name":"Tom","age":25}}
情况二序列化结果:{"code":200,"message":"Success","data":"第一行\n第二行\n第三行"}

注意事项

  • 字段类型要求:@JsonRawValue 通常只适用于 String 类型的字段 。如果将其用于其他类型(如自定义对象、集合等),在序列化时可能会导致 JSON 格式错误,因为 Jackson 不知道如何将非字符串类型按原始 JSON 方式处理。
  • 安全性问题:如果使用 @JsonRawValue 注解的字段内容来自不可信的数据源(如用户输入),直接将其作为原始 JSON 嵌入到响应中,可能会引发安全风险,比如 JSON 注入攻击。因此,需要对输入进行严格的验证和过滤。
  • 与其他注解的兼容性:在使用 @JsonRawValue 时,要注意它与其他 Jackson 注解(如 @JsonSerialize、@JsonDeserialize、@JsonFormat 等)之间的关系。某些情况下,这些注解可能会与 @JsonRawValue 的作用产生冲突,导致序列化或反序列化结果不符合预期。

@JsonRawValue 为处理特殊格式的字符串在 JSON 序列化和反序列化中的表现提供了便捷的方式,但在使用时需要充分考虑类型、安全以及注解兼容性等方面的问题。


网站公告


今日签到

点亮在社区的每一天
去签到