You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:51:03