如何使用Jackson将指定JSON反序列化为含Map的Response类
用Jackson实现JSON数组到Map的反序列化
没问题,我平时处理这种JSON数组转Java Map的场景常用两种方法,都能完美匹配你的需求,下面给你详细说明:
方案一:自定义JsonDeserializer(灵活适配复杂场景)
这种方法适合需要自定义逻辑的情况(不过你说契约保证键唯一,就不用考虑重复键的处理啦),步骤很简单:
1. 编写自定义反序列化器
创建一个继承自JsonDeserializer的类,负责把JSON数组转换成Map:
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; import java.util.HashMap; import java.util.Map; public class ParametersDeserializer extends JsonDeserializer<Map<String, String>> { @Override public Map<String, String> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { Map<String, String> paramMap = new HashMap<>(); // 读取JSON数组节点 JsonNode arrayNode = p.getCodec().readTree(p); // 遍历数组,将每个key-value对存入Map for (JsonNode node : arrayNode) { String key = node.get("key").asText(); String value = node.get("value").asText(); paramMap.put(key, value); } return paramMap; } }
2. 在Response类中指定反序列化器
给parameters字段加上@JsonDeserialize注解,关联我们刚才写的自定义反序列化器:
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.util.Map; public class Response { @JsonDeserialize(using = ParametersDeserializer.class) public Map<String, String> parameters; }
3. 测试反序列化
用ObjectMapper来完成反序列化操作:
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { String json = "{ \"parameters\": [{ \"value\": \"somevalue\", \"key\": \"somekey\" }, { \"value\": \"othervalue\", \"key\": \"otherkey\" } ] }"; ObjectMapper mapper = new ObjectMapper(); Response response = mapper.readValue(json, Response.class); // 输出结果验证 System.out.println(response.parameters.get("somekey")); // 输出 somevalue System.out.println(response.parameters.get("otherkey")); // 输出 othervalue } }
方案二:利用Setter方法转换(简洁轻量)
如果不需要复杂逻辑,这种方法更省事,不用额外写反序列化器,直接在Setter里完成数组到Map的转换:
1. 修改Response类
给parameters字段添加一个接收List<Map<String, String>>类型的Setter方法,并用@JsonProperty标注对应JSON字段:
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.HashMap; import java.util.List; import java.util.Map; public class Response { private Map<String, String> parameters; @JsonProperty("parameters") public void setParameters(List<Map<String, String>> paramList) { this.parameters = new HashMap<>(); for (Map<String, String> param : paramList) { this.parameters.put(param.get("key"), param.get("value")); } } public Map<String, String> getParameters() { return parameters; } }
2. 测试反序列化
和方案一的测试代码一样,直接用ObjectMapper反序列化即可,效果完全相同。
依赖说明
确保你的项目已经引入Jackson的核心依赖(以Maven为例):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 建议使用最新稳定版本 --> </dependency>
内容的提问来源于stack exchange,提问作者WonderCsabo
相关产品推荐
相关产品推荐

