Как я могу использовать неизвестный класс или список в качестве параметра в java?

#java #class #arraylist #jackson #jackson-databind

Вопрос:

У меня есть ответ json. Я использую Джексона, чтобы создать объект Java из ответа json.

 ObjectMapper objectMapper = new ObjectMapper();   Listlt;WorkPositiongt; workPositions = new ArrayListlt;gt;();   try {  workPositions = (Listlt;WorkPositiongt;) objectMapper.readValue(response.body(), new TypeReferencelt;Listlt;WorkPositiongt;gt;() {});  } catch (Exception e) {  e.printStackTrace();  }  

И я хочу создать класс под названием Jackson и сделать этот код статическим методом.

 public class Jackson {  static ObjectMapper objectMapper = new ObjectMapper();  public static Listlt;WorkPositiongt; parseList(String body){  Listlt;WorkPositiongt; list = new ArrayListlt;gt;();  try {  list = (ArrayListlt;WorkPositiongt;) objectMapper.readValue(body, new TypeReferencelt;Listlt;WorkPositiongt;gt;(){});  } catch (JsonProcessingException e) {  e.printStackTrace();  }  return list;  }  

}

Приведенный выше код работает только для класса WorkPosition. Я хочу сделать его доступным для всех классов. Я попробовал Listlt;?gt;, Tlt;?gt;lt;gt;, а также попытался указать в качестве параметра список, который будет возвращен. Но у меня ничего не получилось. Как это можно сделать ?

Комментарии:

1. Дайте попробовать с собой public class Jacksonlt;Tgt; . Ваш метод будет : public static Listlt;Tgt; parseList(String body)

Ответ №1:

Я не думаю, что это возможно, потому что то, что вы пытаетесь сделать динамичным, — это сам параметр типа. Следовательно, лучшим способом будет иметь метод, который может десериализоваться в любой тип, а не только List .

Итак, если у вас есть такой метод, как этот:

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

где MAPPER находится экземпляр ObjectMapper , то его можно вызвать откуда-нибудь вот так:

 deser( "{lt;json-string-heregt;}", new TypeReferencelt;ArrayListlt;SomeClassgt;gt;(){} );  

Этот класс затем можно использовать даже для не — List случаев.

 deser( "{lt;json-string-heregt;}", new TypeReferencelt;SomeClassgt;(){} );  

предполагая, что SomeClass у этого нет конструктора-args или метода создателя Джексона.