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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:53:38