【问题标题】:How to use Jackson's TypeReference with generics?如何将 Jackson 的 TypeReference 与泛型一起使用?
【发布时间】:2016-04-07 07:35:13
【问题描述】:

对于 json 映射,我使用以下方法:

public static <T> T mapJsonToObject(String json, T dtoClass) throws Exception {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(json, new TypeReference<RestResponse<UserDto>>() {
    });
}

UserDto 看起来像这样:

@JsonIgnoreProperties(ignoreUnknown = true)
public class UserDto {

    @JsonProperty("items")
    private List<User> userList;

    public List<User> getUserList() {
        return userList;
    }

    public void setUserList(List<User> userList) {
        this.userList = userList;
    }
}

我想改进这种映射方法,而不是附加到 UserDto 类,并将其替换为泛型。

有可能吗?以及如何?

谢谢。

【问题讨论】:

  • @Dici 我想将一个泛型类作为参数传递给该方法并调用 TypeReference,如下所示:new TypeReference&lt;RestResponse&lt;generic_type_here&gt;&gt;()
  • 您的问题或多或少与this 相同,除了Jackson 而不是Gson。答案还是一样的,你只需要适配库 API。

标签: java json generics jackson mapping


【解决方案1】:

TypeReference 要求您静态指定参数,而不是动态指定参数,因此如果您需要进一步参数化类型,则它不起作用。

我认为您需要的是JavaType:您可以使用TypeFactory 动态构建实例。您通过ObjectMapper.getTypeFactory() 获得TypeFactory 的实例。您还可以从简单的ClassTypeReference 构造JavaType 实例。

【讨论】:

【解决方案2】:

一种方法是定义一个Jackson JavaType 表示clazz 类型的项目列表。您仍然需要在运行时访问泛型参数的类。通常的方法是

<T> class XX { XX(Class<T> clazz, ...) ... } 

在构造时将泛型参数的类传递给泛型类。

访问 Class clazz 变量后,您可以构造一个 Jackson JavaType,例如,使用以下语句表示 clazz 类的项目列表。

JavaType itemType = mapper.getTypeFactory().constructCollectionType(List.class, clazz);

我希望它有所帮助。我在自己的代码中使用了这种方法。

【讨论】:

    【解决方案3】:

    试试这个:

        import com.fasterxml.jackson.databind.ObjectMapper;
        import java.lang.reflect.Array;
        import java.util.Arrays;
        
        ...        
    
    
        public static <TargetType> List<TargetType> convertToList(String jsonString, Class<TargetType> targetTypeClass) {
            List<TargetType> listOfTargetObjects = null;
            ObjectMapper objectMapper = new ObjectMapper();
            TargetType[] arrayOfTargetType = (TargetType[]) Array.newInstance(targetTypeClass, 0);
    
            try {
                listOfTargetObjects = (List<TargetType>) Arrays.asList(objectMapper.readValue(jsonString, arrayOfTargetType.getClass()));
            } catch (JsonMappingException jsonMappingException) {
                listOfTargetObjects = null;
            } catch (JsonProcessingException jsonProcessingException) {
                listOfTargetObjects = null;
            } catch (Exception exception) {
                listOfTargetObjects = null;
            }
    
            return listOfTargetObjects;
        }
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 2011-02-09
      相关资源
      最近更新 更多