Jackson ObjectMapper如何将嵌套结构的data字段序列化为字符串存入POJO
你调用node.get("data").textValue()返回为空的核心原因是:data字段对应的值是JSON数组类型节点,并非JSON字符串类型节点,textValue()方法仅能获取JSON字符串类型节点的文本值,对数组、对象类型节点无效。
以下是两种可直接落地的解决方案:
方案1:手动转换(无需修改POJO,适合临时处理场景)
先读取整段JSON为根节点,再单独将data节点重新序列化为JSON字符串,最后赋值给POJO即可:
ObjectMapper mapper = new ObjectMapper(); // 读取JSON为根节点 JsonNode rootNode = mapper.readTree(jsonString); // 将data节点序列化为完整的JSON字符串 String dataContent = mapper.writeValueAsString(rootNode.get("data")); // 反序列化其他字段到POJO A result = mapper.treeToValue(rootNode, A.class); // 手动赋值data字段 result.setData(dataContent);
注意:使用该方案前需要先给POJO的data字段添加@JsonIgnore注解,避免反序列化其他字段时报类型不匹配错误。
方案2:自定义反序列化器(一劳永逸,适合高频使用场景)
通过自定义反序列化器让Jackson自动完成data节点到JSON字符串的转换,无需每次手动处理:
- 首先编写通用的JSON原始值反序列化器:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class RawJsonDeserializer extends JsonDeserializer<String> { @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { ObjectMapper mapper = (ObjectMapper) p.getCodec(); JsonNode node = mapper.readTree(p); // 将当前节点直接转为JSON字符串返回 return mapper.writeValueAsString(node); } }
- 给POJO的
data字段添加反序列化器注解:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; class A{ // 指定使用自定义反序列化器处理该字段 @JsonDeserialize(using = RawJsonDeserializer.class) private String data; private boolean isvalid; private String nextVal; // 原有getter、setter、其他注解保持不变 }
- 之后直接正常调用反序列化方法即可:
A result = mapper.readValue(jsonString, A.class); // result.getData() 即为完整的data字段JSON字符串
额外优化:如果你使用的是Jackson 2.13及以上版本,不需要自定义反序列化器,直接给
data字段添加@JsonRawValue(deserialize = true)注解即可实现相同效果。
内容的提问来源于stack exchange,提问作者Parth
相关产品推荐
相关产品推荐

