@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 序列化和反序列化中的表现提供了便捷的方式,但在使用时需要充分考虑类型、安全以及注解兼容性等方面的问题。