2015-06-04 43 views
3

我必須從Web服務獲取數據,我使用的是傑克遜,但使用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

列表將是'[{...},{...},...]'。你有'{「國家」:[{...},{...},...}}。這不是一個列表,它是一個帶有「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帖子中有解釋。

+0

是的,它的外表面。但事情是我不會讓diferent類型相同的Json只是需要一個解決方案,將不同類別的工作,例如我不能使用自己的類這樣的'公共類ListCountryWSType { \t \t私人名單的國家; }'因爲它只適用於CountryWSType,我也需要其他類型的。 –

+0

還檢查了你的答案,我遇到了'List countriesList = new Gson()。fromJson(jsonArray,listType);'我認爲它是因爲JSONObject和JSONArray是來自org.json和'Gson()。fromJson '期望擁有gson類?無論如何感謝您的答案。 –

+0

好吧,謝謝你,我改變了你的一些代碼,它完美的工作,那就是我改變了:'List countriesList = new Gson()。fromJson(jsonArray.toString(),listType);' 再次感謝你。 –

相關問題