2015-06-04 2 views
3

Мне нужно получить данные из веб-службы, я использую Джексон, но у меня такая же проблема с использованием Gson, у меня нет проблем с отдельными объектами, но когда я получаю список нескольких объектов, это не так просто для меня.Как читать JSON в список общих объектов в java?

JSON, полученный, как это:

{"country": 
[ 
{"code":"AD","nombre":"Andorra","name":"Andorra"}, 
{"code":"AE","nombre":"Emiratos Árabes Unidos","name":"United Arab Emirates"} 
] 
} 

Это список из моего класса CountryWSType, у меня есть несколько классов, как это и нужен способ, который может получить список любого типа из них. Я пытался разобрать его как список:

List<MyClass> myObjects = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, MyClass.class)); 

также пытается создать собственный тип списка:

public class ListWSType<T> implements List<T>{ 

    private List<T> listaInterna; 

    //implents methods 
    } 

Но я всегда получаю JsonMappingException и у меня нет больше идей о том, как это сделать ,

Я надеюсь, что кто-то может мне помочь.

Как некоторые люди спрашивают здесь класс я пытался разобрать из JSON:

@XmlRootElement(name="country") 
@XmlType(propOrder={"code", "nombre", "name"}) 
public class CountryWSType { 

    /** Código ISO */ 
    @XmlElement(name="code") 
    public String code; 

    /** Nombre en español */ 
    @XmlElement(name="nombre") 
    public String nombre; 

    /** Nombre en inglés */ 
    @XmlElement(name="name") 
    public String name; 

    /** Constructor sin parámetros. No inicializa nada... 
    * Está para que funcione el marshall/unmarshall. 
    */ 
    public CountryWSType() {} 
} 

Также обратите внимание, чем когда я положил MyClass это означает класс CountryWSType, извините за missunderstood.

+0

Я предполагаю, что MyClass - это ваш класс, поддерживающий объекты JSON? Возможно, если бы мы могли видеть этот класс и трассировку стека ошибок, было бы легче выяснить, в чем проблема. – Micho

+0

A Список будет '[{...}, {...}, ...]'. У вас есть '{" страна ": [{...}, {...}, ...]}'. Это не список, это объект с полем 'country', который является списком. – immibis

+0

На внешнем уровне у вас есть объект JSON, а не массив JSON. Это переводит на карту, а не на список. –

ответ

0

Может быть, это поможет:

//first convert input string to json array 
JSONObject jsonobject = new JSONObject(countriesAsJsonString); 

JSONArray jsonArray = jsnobject.getJSONArray("countries"); 

//then get the type for list and parse using gson as 
Type listType = new TypeToken<List<MyClass>>(){}.getType(); 
List<MyClass> countriesList = new Gson().fromJson(jsonArray, listType); 

Если вы говорите, ваши JSON элементы arrary могут быть разных типов, чем картограф не будет знать, какой тип класса для создания экземпляра и вам нужно будет предоставить дополнительные атрибут в вашем json, чтобы указать на это, уродливый подход, особенно если json является внешней стороной. Но если это то, чего вы хотите, чем объясняется в this SO post.

+0

да, его внешняя облицовка. Но дело в том, что я не получаю разные типы в том же Json, просто нужно решение, которое будет работать с разными классами, например, я не могу использовать собственный класс, как этот 'public class ListCountryWSType { \t \t private List страны; } 'потому что он будет работать только с CountryWSType, и мне это нужно и для других типов. –

+0

Также проверял ваш ответ, и у меня возникают проблемы с «List countriesList = new Gson(). FromJson (jsonArray, listType);' Я думаю, что это потому, что JSONObject и JSONArray являются классами из org.json и'Gson(). FromJson «Ожидается, что у вас есть классы gson? Спасибо за ответ в любом случае. –

+0

Хорошо, спасибо, я сменил часть вашего кода, и он отлично работает, вот что я изменил: «Список countriesList = new Gson(). FromJson (jsonArray.toString(), listType);' Еще раз спасибо. –

Смежные вопросы