如何将JSON中的Object反序列化为Java类的String类型字段?
解决Jackson反序列化JSON Object为String字段的问题
针对你遇到的问题——JSON中payload是Object结构,但目标类Properties的payload是String类型,且无法修改目标类和JSON载荷,可通过自定义Jackson反序列化器解决,步骤如下:
1. 编写自定义反序列化器
创建一个专门处理payload字段的反序列化器,将JSON Object直接序列化为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 java.io.IOException; public class PayloadToStringDeserializer extends JsonDeserializer<String> { @Override public String deserialize(JsonParser parser, DeserializationContext ctx) throws IOException { JsonNode node = parser.getCodec().readTree(parser); // 将JsonNode转为JSON字符串,保留原结构 return node.toString(); } }
2. 注册反序列化器到ObjectMapper
通过SimpleModule将自定义反序列化器绑定到Properties类的payload字段上,避免影响其他String类型字段的解析:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; public class Main { public static void main(String[] args) throws IOException { // 初始化ObjectMapper ObjectMapper objectMapper = new ObjectMapper(); // 创建模块并注册反序列化器 SimpleModule module = new SimpleModule(); module.addDeserializer(String.class, new PayloadToStringDeserializer(), // 指定仅对Properties类的payload字段生效 com.fasterxml.jackson.databind.introspect.AnnotatedField.class, Properties.class.getDeclaredField("payload")); objectMapper.registerModule(module); // 示例JSON字符串(补全完整结构) String json = "{\"properties\": {\"url\": \"https://stackoverflow.com/questions\",\"requestType\": \"GET\",\"payload\": {\"testId\": 123,\"testName\": \"API\",\"description\": \"Call GET Request\",\"testCode\": \"STACKD001\"}}}"; // 解析JSON到对应结构(假设外层有包装类,可根据实际调整) Wrapper wrapper = objectMapper.readValue(json, Wrapper.class); Properties properties = wrapper.getProperties(); // 输出payload的字符串形式 System.out.println(properties.getPayload()); } // 示例包装类,对应外层JSON结构 static class Wrapper { private Properties properties; // getter和setter public Properties getProperties() { return properties; } public void setProperties(Properties properties) { this.properties = properties; } } }
补充说明
- 如果你的JSON直接是
Properties的结构(无外层properties字段),直接解析到Properties类即可。 - 若需要格式化后的JSON字符串,可将反序列化器中的
node.toString()替换为objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(node)。 - 若
payload字段可能为null,可在反序列化器中添加null判断,避免空指针异常。
内容的提问来源于stack exchange,提问作者Seegel
相关产品推荐
相关产品推荐

