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

