#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 или метода создателя Джексона.