【问题标题】:How can i use an unknown class or a list as a parameter in java?如何在 java 中使用未知类或列表作为参数?
【发布时间】:2022-01-02 22:49:04
【问题描述】:

我有一个 json 响应。我正在使用 Jackson 从 json 响应中生成 Java 对象。

ObjectMapper objectMapper = new ObjectMapper();

    List<WorkPosition> workPositions = new ArrayList<>();

    try {
        workPositions = (List<WorkPosition>) objectMapper.readValue(response.body(), new TypeReference<List<WorkPosition>>() {});
    } catch (Exception e) {
        e.printStackTrace();
    }

我想创建一个名为 Jackson 的类,并让这段代码成为静态方法。

public class Jackson {

static ObjectMapper objectMapper = new ObjectMapper();

public static List<WorkPosition> parseList(String body){
    List<WorkPosition> list = new ArrayList<>();
    try {
        list = (ArrayList<WorkPosition>) objectMapper.readValue(body, new TypeReference<List<WorkPosition>>(){});
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    return list;        
}

}

以上代码仅适用于 WorkPosition 类。我想让它适用于所有班级。我尝试过 List>、T,还尝试将返回的列表作为参数。但我没有工作。这是怎么做到的?

【问题讨论】:

  • 试试public class Jackson&lt;T&gt;。你的方法是:public static List&lt;T&gt; parseList(String body)

标签: java class arraylist jackson jackson-databind


【解决方案1】:

我认为这是不可能的,因为您试图使动态的是类型参数本身。因此,更好的方法是拥有一个可以反序列化为任何类型的方法,而不仅仅是List

所以,如果你有这样的方法:

public static <T> T deser( String json, TypeReference<T> typeRef ){
    if( json == null || json.length() == 0 ) return null;
    try{
        return MAPPER.readValue( json, typeRef );
    }
    catch( IOException e ){
        throw new RuntimeException( e );
    }
}

其中MAPPERObjectMapper 的一个实例,那么它可以从这样的地方调用:

deser( "{<json-string-here>}", new TypeReference<ArrayList<SomeClass>>(){} );

这个类甚至可以用于非List 的情况。

deser( "{<json-string-here>}", new TypeReference<SomeClass>(){} );

假设 SomeClass 具有无参数构造函数或 Jackson 创建者方法。

【讨论】:

    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 2014-08-08
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2020-07-13
    • 2021-04-24
    相关资源
    最近更新 更多