Jackson 反序列化为List

本文详细介绍了如何使用Jackson库将JSON字符串反序列化为自定义对象列表,包括常规反序列化、特定类型反序列化的实现及解决反序列化问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Jackson 如何把json字符串反序列化为List呢? 
(List中是自定义对象) 
先看下常规的反序列化:

@Test
    public void test_reserialize(){
        String jsonInput = "{\"addrr\":{\"country\":\"中国\",\"state\":\"湖北省\",\"street\":\"清河\"},\"age\":25,\"hobby\":\"\",\"name\":\"黄威\"}";
        ObjectMapper mapper = new ObjectMapper();
        Student student;
        try {
            student = mapper.readValue(jsonInput, Student.class);
            System.out.println(student.getAddrr().getStreet());
            System.out.println(student.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 运行结果

 

序列化

@Test
    public void test_004(){
        List<Teacher> list=new ArrayList<Teacher>();
        Teacher t=new Teacher();
        t.setId(2);
        t.setName("雄鹰表");
        t.setTitle("aa");
        list.add(t);

        t=new Teacher();
        t.setId(3);
        t.setName("陈定生");
        t.setTitle("bb");
        list.add(t);

        t=new Teacher();
        t.setId(4);
        t.setName("张阿勇");
        t.setTitle("cc");
        list.add(t);

        ObjectMapper mapper = new ObjectMapper();
        String content;
        try {
            content = mapper.writeValueAsString(list);
            System.out.println(content);
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

运行结果
[{“id”:2,”title”:”aa”,”name”:”雄鹰表”},{“id”:3,”title”:”bb”,”name”:”陈定生”},{“id”:4,”title”:”cc”,”name”:”张阿勇”}]

反序列化 
把上述json字符串反序列化为List 
代码如下:

@Test
    public void test_006(){
        String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]";
        ObjectMapper mapper = new ObjectMapper();
        List student;
        try {
            student = mapper.readValue(jsonInput, List.class);
            System.out.println(student.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 运行时 

 没有达到预期效果,虽然反序列化成了List,但是并不是List<Teacher>,而是List<HashMap> 

如何解决这个问题呢? 
解决方法:使用mapper.getTypeFactory().constructParametricType

/**   
     * 获取泛型的Collection Type  
     * @param collectionClass 泛型的Collection   
     * @param elementClasses 元素类   
     * @return JavaType Java类型   
     * @since 1.0   
     */   
 public static JavaType getCollectionType(ObjectMapper mapper,Class<?> collectionClass, Class<?>... elementClasses) {   
     return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);   
 }
    @Test
    public void test_006(){
        String jsonInput="[{\"id\":2,\"title\":\"aa\",\"name\":\"雄鹰表\"},{\"id\":3,\"title\":\"bb\",\"name\":\"陈定生\"},{\"id\":4,\"title\":\"cc\",\"name\":\"张阿勇\"}]";
        ObjectMapper mapper = new ObjectMapper();
        List student;
        try {
            student = mapper.readValue(jsonInput, getCollectionType(mapper, List.class, Teacher.class));
            System.out.println(student.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 运行时:

 

http://blog.youkuaiyun.com/hw1287789687/article/details/46955179

作者:黄威

联系方式:1287789687@qq.com

<think>好的,我现在需要帮用户解决如何使用Jackson反序列化数组的问题。首先,我得回忆一下Jackson的基本用法,特别是处理数组或集合的情况。用户提供的引用里有几个相关的资料,我需要结合这些来整理答案。 首先,引用[4]提到Jackson反序列化数组类型JSON值的关键是正确映射到Java集合,所以可能需要使用TypeReference来指定集合类型。引用[2]提到了ObjectMapper类,这是Jackson的核心,用于序列化和反序列化。用户的问题是关于数组的,所以应该重点讲解如何将JSON数组转换为Java中的List或数组对象。 然后,我需要考虑用户可能的代码结构。他们可能有一个JSON数组字符串,比如["a","b","c"],需要将其转换为List<String>或者String[]。根据引用[4],使用readValue方法配合TypeReference应该可以处理泛型集合的情况。例如: List<String> list = mapper.readValue(json, new TypeReference<List<String>>() {}); 同时,对于数组类型,直接使用String[].class作为目标类型也是可行的,比如: String[] array = mapper.readValue(json, String[].class); 接下来,用户可能需要处理更复杂的对象数组。比如,如果JSON数组包含对象,如[{"name":"Alice"},{"name":"Bob"}],对应的Java类可能是List<User>。这时候同样需要TypeReference来指定泛型类型,或者使用JavaType来明确类型信息。 另外,引用[5]中的@JsonProperty注解可能在自定义反序列化时用到,但如果是标准数组,可能不需要这个。不过如果用户有自定义构造函数或字段,可能需要配置注解,但基础示例可能不需要涉及这些。 用户可能遇到的常见问题包括类型擦除导致的泛型信息丢失,这时候必须使用TypeReference或者JavaType来解决。例如,直接使用List.class会导致Jackson无法知道元素类型,从而可能反序列化为LinkedHashMap而不是预期的对象。 需要确保示例代码正确无误,语法正确,比如正确导入ObjectMapper和TypeReference。同时,要提到异常处理,比如可能抛出的JsonProcessingException,但示例中可以简化不写try-catch,但用户实际使用时需要注意。 总结步骤应该是: 1. 创建ObjectMapper实例。 2. 对于简单数组,使用目标类型的Class对象。 3. 对于泛型集合,使用TypeReference指定具体类型。 4. 处理复杂对象数组时同样应用TypeReference。 可能还需要提到当JSON结构复杂时,如何结合JavaType来构建类型信息,但基础示例可能不需要太深入,保持简单明了。 最后,生成相关问题时要围绕Jackson处理数组的其他方面,比如处理多维数组、混合类型数组、性能优化或异常处理等。</think>### Jackson 反序列化数组的实现步骤 #### 1. 基础数组反序列化 **字符串数组示例**: ```java ObjectMapper mapper = new ObjectMapper(); String json = "[\"apple\",\"banana\",\"orange\"]"; String[] fruits = mapper.readValue(json, String[].class); ``` **集合类型反序列化**(使用`TypeReference`解决泛型擦除问题): ```java List<String> fruitList = mapper.readValue(json, new TypeReference<List<String>>(){}); ``` #### 2. 对象数组反序列化 **定义Java对象**: ```java public class Product { private String name; private double price; // 必须提供默认构造函数或@JsonCreator注解[^5] // Getter/Setter省略 } ``` **反序列化对象数组**: ```java String productJson = "[{\"name\":\"Laptop\",\"price\":5999},{\"name\":\"Phone\",\"price\":3999}]"; List<Product> products = mapper.readValue(productJson, new TypeReference<List<Product>>(){}); ``` #### 3. 多维数组处理 ```java String matrixJson = "[[1,2,3],[4,5,6]]"; int[][] matrix = mapper.readValue(matrixJson, int[][].class); ``` #### 4. 类型安全的高级配置 通过`JavaType`显式定义复杂类型: ```java JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class, Product.class); List<Product> productList = mapper.readValue(productJson, listType); ``` ### 关键注意事项 - **必须处理泛型类型擦除**:直接使用`List.class`会导致元素类型丢失 - **空数组兼容性**:JSON空数组`[]`会被反序列化为空集合 - **类型一致性**:JSON数组元素类型需与Java类型匹配 - **性能优化**:重用`ObjectMapper`实例(线程安全)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值