Java Jackson解析JSON时如何将Payload字段视为字符串?
解决Jackson把payLoad字段当作原始字符串解析的问题
刚好之前处理过一模一样的场景!核心就是让Jackson别去解析payLoad里的内容,直接把它当成纯字符串读出来,给你两种实用的实现方式,根据你的代码结构选就行:
方式一:用@JsonRawValue注解(最简单)
@JsonRawValue是Jackson专门用来处理这种“原样保留原始内容”的注解,虽然它一开始是为序列化设计的,但2.0版本之后也完美支持反序列化。
先给你的实体类加上这个注解:
public class Record { private String recordId; // 关键就是这行注解! @JsonRawValue private String payLoad; // 下面的Getter/Setter该咋写咋写 public String getRecordId() { return recordId; } public void setRecordId(String recordId) { this.recordId = recordId; } public String getPayLoad() { return payLoad; } public void setPayLoad(String payLoad) { this.payLoad = payLoad; } }
然后解析你的示例JSON试试:
String json = "{ \"recordId\":\"48\", \"payLoad\":{\"firstName\":\"John\",\"lastName\":\"Doe\"}}"; ObjectMapper mapper = new ObjectMapper(); Record record = mapper.readValue(json, Record.class); // 这时候payLoad拿到的就是原始的JSON字符串:"{\"firstName\":\"John\",\"lastName\":\"Doe\"}" System.out.println(record.getPayLoad());
不管payLoad里面是JSON对象、YAML文本还是CSV内容(只要在原始JSON里是合法的格式,比如CSV要包成字符串),这个注解都能直接把内容原样转成Java字符串,省心得很。
方式二:自定义反序列化器(应对复杂场景)
如果你的payLoad格式特别跳脱——比如有时候是JSON对象,有时候是带引号的CSV字符串,甚至偶尔是数组——那自定义反序列化器会更灵活:
- 先写个反序列化器类,逻辑就是直接读取节点的原始字符串:
public class RawStringDeserializer extends JsonDeserializer<String> { @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 不管当前节点是啥类型,直接转成原始字符串返回 return p.readValueAsTree().toString(); } }
- 然后在实体类的
payLoad字段上指定用这个反序列化器:
public class Record { private String recordId; @JsonDeserialize(using = RawStringDeserializer.class) private String payLoad; // Getter/Setter照旧 }
这种方式能覆盖各种奇怪的边缘情况,怎么都能把payLoad的内容当成纯字符串读出来。
小提醒
要是payLoad里是CSV内容,在原始JSON里必须把它包成字符串(加双引号),比如"payLoad": "firstName,lastName\nJohn,Doe",不然Jackson会因为格式不合法报错哦。
内容的提问来源于stack exchange,提问作者Janet T
相关产品推荐
相关产品推荐

