使用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
相关产品推荐
相关产品推荐

