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

使用Jackson将含动态键的JSON反序列化为自定义Java POJO的问题求助

解决Jackson反序列化JSON到自定义POJO的问题

首先,你的POJO设计思路是完全正确的,问题主要出在测试代码的实现细节上,我来一步步帮你修正:

问题排查与核心修正点

1. 别混用多个JSON处理库

你在测试里先用JSONObject解析JSON再转成字符串传给Jackson的ObjectMapper,这完全是多余操作,还可能引入不必要的格式问题。直接把原始JSON字符串传入readValue即可。

2. 确保Jackson依赖正确引入

如果是Maven项目,确认pom.xml里已经包含Jackson核心依赖(用最新稳定版即可):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.2</version>
</dependency>

3. 重构测试代码

去掉多余的JSONObject步骤,直接用原始JSON字符串做反序列化操作。

完整可运行示例

1. 你的POJO类(无需修改,逻辑正确)

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;
import java.util.Map;

public class Model {
    private final Map<String, List<String>> modelView;
    private final List<String> modelList;

    @JsonCreator
    public Model(@JsonProperty("view") Map<String, List<String>> modelView, 
                 @JsonProperty("list") List<String> modelList) {
        this.modelView = modelView;
        this.modelList = modelList;
    }

    public Map<String, List<String>> getModelView() {
        return modelView;
    }

    public List<String> getModelList() {
        return modelList;
    }
}

2. 修正后的测试代码

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import java.util.List;

public class ModelDeserializationTest {

    // 提供测试用的JSON字符串
    private String getTestJson() {
        return "{ \"view\": { \"1\": [\"stringA\", \"stringB\"], \"2\": [\"stringA\", \"stringB\"], \"3\": [\"stringA\", \"stringB\"] }, \"list\": [\"stringC\", \"stringD\"] }";
    }

    @Test
    public void testJsonToPojo() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        // 直接用原始JSON字符串解析为Model对象
        Model model = mapper.readValue(getTestJson(), Model.class);
        
        // 打印验证结果
        System.out.println("View内容: " + model.getModelView());
        System.out.println("List内容: " + model.getModelList());
        
        // 可选:添加断言确保结果符合预期
        assert model.getModelView().size() == 3;
        assert model.getModelList().equals(List.of("stringC", "stringD"));
    }
}

额外优化建议

如果觉得POJO代码太繁琐,可以用Lombok注解简化构造器和Getter方法,减少样板代码:

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.List;
import java.util.Map;

@Getter
@AllArgsConstructor(onConstructor = @__(@JsonCreator))
public class Model {
    @JsonProperty("view")
    private final Map<String, List<String>> modelView;
    @JsonProperty("list")
    private final List<String> modelList;
}

运行修正后的测试代码,就能正常完成反序列化并输出预期结果了。如果仍有问题,可以查看异常栈信息,定位是否存在JSON语法错误或类型不匹配的细节问题。

内容的提问来源于stack exchange,提问作者Shvalb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:14:08