`

jsckson序列化处理泛型

 
阅读更多
我有这样两个类

package com.vipshop.mapi.wallet.test;

import java.util.List;


public class A<R> {

    private List<R> list;

    public List<R> getList() {
        return list;
    }

    public void setList(List<R> list) {
        this.list = list;
    }
}

package com.vipshop.mapi.wallet.test;


public class B {
    private String name = "test";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


我们注意到a类是有泛型的,内容是动态的,我们开始的想法是这样的,动态构建一个TypeReference就行了吗

    public static <T> TypeReference<A<T>> getReference(T clz) {
        return new TypeReference<A<T>>() {};
    }


但是实际上是不行的,TypeReference的类型是类型定义的时候就确定了的,和你传进去的没有关系的,永远是<A<T>>

那我们要怎么做呢,
一种做法是覆盖TypeReference的getType方法,把真实的type动态构造传进去,就是方法getReference2

另外一种做法是利用jackson提供的构造JavaType的方式,就是方法getReference3



package com.vipshop.mapi.wallet.test;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by cloud.huang on 17/1/10.
 */
public class JacksonTest {
    private static final ObjectMapper objectMapper = new ObjectMapper();



    public static void main(String[] args) throws Exception {
        List<B> list = new ArrayList<>();
        list.add(new B());
        A a = new A();
        a.setList(list);

        String json = objectMapper.writeValueAsString(a);
        TypeReference typeReference = getReference2(B.class);
//        JavaType typeReference = getReference3(B.class);
        A a2 = objectMapper.readValue(json, typeReference);

    }


    public static TypeReference<A> getReference2(Type clz) {
        Type[] types = new Type[1];
        types[0] = clz;
        final ParameterizedTypeImpl type = ParameterizedTypeImpl.make(A.class, types, A.class.getDeclaringClass());
        return new TypeReference<A>() {
            @Override
            public Type getType() {
                return type;
            }
        };
    }


    public static JavaType getReference3(Class clz) {
        JavaType type = objectMapper.getTypeFactory().constructParametrizedType(A.class, A.class, clz);
        return type;
    }
}




当然有人说,我们其实只要写一个new TypeReference<A<B>>()就可以了,但是如果我们想动态的传入B类型的话,还是有必要的。


0
0
分享到:
评论

相关推荐

    序列化工具(Gson, Jackson, FastJson, ProtoBuf)

    它的使用简单,支持复杂的类型转换,包括泛型、枚举、自定义序列化和反序列化策略。Gson的优势在于其灵活性和强大的类型处理能力,使得它在处理JSON数据时非常便捷。 2. Jackson(FasterXML Jackson): Jackson是...

    解析Java的Jackson库中对象的序列化与数据泛型绑定

    Java的Jackson库是一个广泛使用的库,它主要用于处理JSON数据,包括对象的序列化和反序列化。Jackson库的核心是`ObjectMapper`类,它提供了一种简单的方式来将Java对象转换成JSON格式,反之亦然。在给定的例子中,...

    fastJosn Gson Jackson 序列化和反序列化所需要的jarlib.rar

    在Java开发中,序列化和反序列化是数据转换的重要环节,主要用于将对象转换为可存储或传输的数据格式,如JSON字符串,以及将这些数据还原为原来的对象。本压缩包包含fastJson、Gson和Jackson这三种流行JSON库的jar...

    Jackson进行json序列化

    4. **类型绑定**:Jackson还支持多态性和泛型处理。使用`@JsonSubTypes`和`@JsonTypeInfo`可以处理不同类型的序列化和反序列化。 5. **模块和扩展**:Jackson有许多可选模块,如处理XML(jackson-dataformat-xml)...

    fastjson、gson、jackson序列化和反序列化所用 json

    Jackson还支持注解驱动的映射,允许开发者通过注解来控制序列化和反序列化的具体行为。 这三个库各有特点,Fastjson以其速度和简洁性脱颖而出,Gson则以其灵活性和对复杂类型的处理能力受到青睐,而Jackson则在功能...

    jackson2.7-jar

    3. **类型绑定与泛型**:Jackson 2.7改进了对泛型的支持,能够更准确地处理泛型类型,从而在反序列化时能正确恢复原始的类型信息。 4. **流式API**:`JsonParser`和`JsonGenerator`是Jackson的核心流式API,它们...

    最新的高性能 JSON 处理jackson-2.9.2.jar下载

    Jackson是Java领域中广泛使用的高性能JSON处理库,其2.9.2版本是该库的一个稳定版本,提供了高效且功能丰富的JSON序列化和反序列化功能。Jackson库由三个主要模块组成,这些模块在给定的压缩包文件中分别对应为: 1...

    jackson-annotations.jar jackson-core.jar jackson-databind.jar

    `ObjectMapper`类在这个模块中得到了进一步扩展,支持更多的高级特性,如类型转换、泛型处理、复杂类型的序列化和反序列化等。 使用Jackson库,开发者可以轻松地在Java对象和JSON字符串之间进行转换。例如,通过`...

    Jackson进行JSON解析和序列化jar包

    Jackson库提供了JSON的解析(Deserialization)和序列化(Serialization)功能,使得Java对象与JSON字符串之间可以轻松地进行转换。 Jackson库的核心组件包括: 1. **Jackson ObjectMapper**:这是Jackson库中的...

    jackson 全部jar包

    它提供了高效、功能丰富的处理JSON的方式,包括序列化、反序列化以及数据绑定。在JSON的解析和生成方面,Jackson具有高性能、易用性以及灵活性等优点。在版本2.6中,Jackson库提供了一系列的JAR包,涵盖了不同的功能...

    SSM框架json使用jackson

    5. **处理泛型**:Jackson还支持泛型的序列化和反序列化,这对于处理如`List&lt;T&gt;`这样的类型特别有用。 6. **错误处理**:在处理JSON数据时,Jackson会抛出异常,如`JsonParseException`和`JsonMappingException`,...

    jackson-databind jackson-annatation jackson-core jackson-mapper

    2. **jackson-annotations**:这个模块提供了用于注解Java类和字段的一系列注解,以指示如何在序列化和反序列化过程中处理它们。例如,`@JsonProperty`用于指定哪个字段应映射到JSON属性,`@JsonIgnore`用于忽略某个...

    jackson-core-asl-1.9.13+jackson-mapper-asl-1.9.13札包

    除了基本的功能外,Jackson库还有许多高级特性,如类型转换、类型安全的泛型处理、处理日期和时间的模块、以及对XML和CSV的支持等。在实际开发中,根据具体需求,可以结合使用这些特性来优化JSON操作的效率和灵活性...

    jackson-2.4.2相关jar包

    Jackson是Java领域中广泛使用的JSON处理库,它提供了一套高效、灵活的API来解析、生成、序列化和反序列化JSON数据。标题中的"jackson-2.4.2相关jar包"指的是该版本的Jackson库的Java归档(JAR)文件,通常包含了...

    jackson的jar包

    5. **Jackson-module-afterburner**:这是一个性能优化模块,可以自动检测和处理常见的POJO(Plain Old Java Object)模式,提高序列化和反序列化的速度。 6. **Jackson-modules-java8**:对于Java 8的新特性,如...

    jackson-core-2.10.0.zip

    3. **类型绑定(Type Binding)**:Jackson允许在序列化和反序列化过程中处理复杂的类型信息,如泛型、数组、集合和映射。这使得处理复杂的数据结构变得更加容易。 4. **注解支持(Autowired Annotations)**:Jackson...

    jackson-datatype-guava-2.8.0.zip

    2. **类型绑定**:Jackson的类型绑定机制在处理Guava类型时得到了增强,能够准确地识别和处理泛型信息,确保序列化和反序列化的精度。 3. **序列化和反序列化策略**:对于Guava的特殊类,如Range或Duration,...

    jackson解析必备的三个jar包

    Jackson是Java领域中广泛使用的JSON处理库,它提供了一套高效、灵活的API来解析、生成、序列化和反序列化JSON数据。在Java项目中,如果需要与JSON进行交互,Jackson是一个非常理想的选择。标题提到的“jackson解析...

    jackson三个核心类库.rar

    在处理复杂的JSON结构时,Jackson提供了许多高级特性,如类型绑定、自定义序列化器和反序列化器、处理日期和时间、支持泛型等。此外,Jackson还支持与其他数据格式的互操作,如XML、YAML等。通过扩展和配置,Jackson...

    多版本jackson-all依赖包

    Jackson是Java领域中广泛使用的JSON处理库,它提供了一套完整的解决方案,包括序列化、反序列化以及数据绑定等功能。`jackson-all`是Jackson早期版本的一个打包集合,包含了所有核心模块,使得开发者可以一次性引入...

Global site tag (gtag.js) - Google Analytics