2013-08-04 40 views
0

我的應用程序必須使用一個web服務,它以json格式生成一個特定類型的數組。 這是方法:如何將json字符串轉換爲java List?

public Unidade[] getUnidades(){ 
    Session s = ConnectDb.getSession(); 
    try { 
     List<Unidade> lista = new ArrayList<Unidade>(s.createQuery("from Unidade order by unidSigla").list()); 
     Unidade[] unidades = lista.toArray(new Unidade[0]); 
     return unidades; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } finally { 
     s.close(); 
    } 
} 

然後,在我的客戶,它的消耗是這樣的:

WebResource webResource = client.resource("http://localhost:8080/RestauranteWeb/rest/unidades/"); 
    ClientResponse response = webResource.accept("application/json").get(ClientResponse.class); 
    String output = response.getEntity(String.class); 
    System.out.println(output); 
    Unidade[] unidades = new Gson().fromJson(output, Unidade[].class); 
    System.out.println(unidades); 

JSON字符串被正確檢索,但它轉換成數組時,我得到以下錯誤:

{"unidade":[{"unidCodigo":"17","unidSigla":"BOSTA"},{"unidCodigo":"18","unidSigla":"BOSTE"},{"unidCodigo":"13","unidSigla":"bumerangui"},{"unidCodigo":"15","unidSigla":"HHH"},{"unidCodigo":"16","unidSigla":"HHH2"},{"unidCodigo":"6","unidSigla":"papapa"},{"unidCodigo":"9","unidSigla":"pobrena"},{"unidCodigo":"7","unidSigla":"sei la"},{"unidCodigo":"3","unidSigla":"TAÇINHA"},{"unidCodigo":"5","unidSigla":"tanque"},{"unidCodigo":"1","unidSigla":"UNIDADE"},{"unidCodigo":"14","unidSigla":"zerao"}]} 
Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 
    at com.google.gson.Gson.fromJson(Gson.java:815) 
    at com.google.gson.Gson.fromJson(Gson.java:768) 
    at com.google.gson.Gson.fromJson(Gson.java:717) 
    at com.google.gson.Gson.fromJson(Gson.java:689) 
    at br.mviccari.client.UnidadeClient.main(UnidadeClient.java:40) 
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 
    at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:338) 
    at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70) 
    at com.google.gson.Gson.fromJson(Gson.java:803) 
    ... 4 more 

我做錯了什麼?

+0

我看到你正在使用球衣客戶端並在其上分層GSON。不確定這是否是有意的,但與JAXB註釋的JSON集成非常酷。 Jersey客戶端會自動解析響應,以便返回對象。它會讓你的代碼更簡單一些。 –

回答

2

正如您從數據和錯誤中看到的,頂級json類型是一個對象,而不是數組。你實際上擁有的是一個具有Unidade元素數組的頂級對象。你應該爲你的頂級類定義類似這樣的東西:

public class UnidadeWrapper { 
    public Unidade[] unidade; 
} 
+0

嗯,那有效!我覺得創建一個包裝類的需求很奇怪,但如果這是最好的解決方案,這就是我要做的。 –

+0

@MateusViccari - 這是由於json的寫法。如果jso的頂層是一個數組,則不需要包裝。 – jtahlborn

相關問題