【问题标题】:Converting Spring ParameterizedTypeReference to Jackson TypeReference将 Spring ParameterizedTypeReference 转换为 Jackson TypeReference
【发布时间】:2017-11-18 07:18:04
【问题描述】:

我在库中使用 spring RestTemplate。库方法的输入接受 ParameterizedTypeRecerence 并将其传递给 rest 模板进行转换。

由于不相关的原因,我需要将响应正文作为 byte[] 并使用 Jackson 手动转换为 json。 Jackson 期望 TypeReference 类进行转换。

我正在寻找一种将这些转换为类的方法。

【问题讨论】:

    标签: spring jackson


    【解决方案1】:

    可以使用辅助类

    public class CustomTypeReference extends TypeReference<Object>{
        private final Type type;
    
        public CustomTypeReference(ParameterizedTypeReference pt){
            this.type = pt.getType();
        }
    
        @Override
        public Type getType() {
            return type;
        }
    }
    

    并像这样使用它:

    ParameterizedTypeReference<List<String>> typeRef
            = new ParameterizedTypeReference<List<String>>() {};
    TypeReference tr = new CustomTypeReference(typeRef);
    
    ObjectMapper mapper = new ObjectMapper();
    String jsonStr = "[\"key\", \"someStr\"]";
    List<String> data = mapper.readValue(jsonStr, tr);
    

    或者只是匿名TypeReference&lt;Object&gt;

    ParameterizedTypeReference<List<String>> typeRef
            = new ParameterizedTypeReference<List<String>>() {};
    
    TypeReference tr = new TypeReference<Object>(){
        public Type getType() {
            return typeRef.getType();
        }
    };
    

    【讨论】:

    • 你的意思是TypeReference&lt;List&lt;String&gt;&gt; tr = new CustomTypeReference(typeRef);
    • @Arash nope,TypeReference tr = new CustomTypeReference(typeRef); 或 TypeReference,但没关系,因为 CustomTypeReference 忽略泛型声明并且不以任何方式依赖它并使用您的类型传入构造函数。 TypeReference&lt;T&gt; 实际上是抽象类,您只需要覆盖 getType() 以使其按您希望的方式工作。只需忽略 github.com/FasterXML/jackson-core/blob/master/src/main/java/com/… 默认 _type 变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多