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

如何用Jackson将JSON数组位置映射到Java类属性?

Jackson实现JSON数组到Java类属性的位置映射

当然可以实现,Jackson提供了直接的注解方式来完成JSON数组元素到Java类属性的位置映射,针对你给出的场景,有两种常用方案:

方案一:利用记录类构造器结合@JsonCreator与索引式@JsonProperty

Java记录类会自动生成构造器,我们可以在构造器参数上通过@JsonProperty指定对应的数组索引(索引从0开始),配合@JsonCreator标记构造器,就能实现按位置映射:

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

record Person(
    @JsonProperty("0") Long id,
    @JsonProperty("1") String name,
    @JsonProperty("2") Integer age
) {
    @JsonCreator
    public Person(
        @JsonProperty("0") Long id,
        @JsonProperty("1") String name,
        @JsonProperty("2") Integer age
    ) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
}

解析示例

用ObjectMapper解析JSON的代码如下:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {
    public static void main(String[] args) throws Exception {
        String json = "{\"person\": [1, \"Evgeni\", 35]}";
        ObjectMapper mapper = new ObjectMapper();
        // 解析包含person字段的外层对象
        Outer outer = mapper.readValue(json, Outer.class);
        System.out.println(outer.person()); // 输出 Person[id=1, name=Evgeni, age=35]
    }

    record Outer(Person person) {}
}

方案二:自定义反序列化器(复杂场景可选)

如果需要更灵活的逻辑(比如处理数组长度不固定、特殊类型转换等),可以自定义JsonDeserializer:

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 PersonDeserializer extends JsonDeserializer<Person> {
    @Override
    public Person deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        JsonNode node = p.getCodec().readTree(p);
        Long id = node.get(0).asLong();
        String name = node.get(1).asText();
        Integer age = node.get(2).asInt();
        return new Person(id, name, age);
    }
}

然后在Person类上标记使用该反序列化器:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;

@JsonDeserialize(using = PersonDeserializer.class)
record Person(Long id, String name, Integer age) {}

注意事项

  • 数组索引从0开始,第一个元素对应@JsonProperty("0"),以此类推
  • 记录类的构造器必须用@JsonCreator标记,Jackson才能识别带注解的参数
  • 如果JSON数组元素类型和Java属性类型不匹配,Jackson会自动尝试类型转换,转换失败会抛出异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:27:39