2013-08-04 5 views
0

내 응용 프로그램은 json 형식으로 특정 유형의 배열을 생성하는 웹 서비스를 사용해야합니다.json String을 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(); 
    } 
} 

그런 다음, 내 클라이언트에서,이 같은 소비 것 : 이는 방법입니다 JSON 문자열이 제대로 검색됩니다

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); 

하지만 배열로 변환 할 때 나는 다음과 같은 오류가 발생합니다 :

{"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을 레이어링하는 것을 볼 수 있습니다. 이것이 의도적 인 것인지 확실하지 않지만 JSON과 JAXB 주석의 통합은 매우 좋습니다. 저지 클라이언트는 자동으로 응답을 구문 분석하여 개체를 반환 할 수 있습니다. 그것은 당신의 코드를 조금 더 단순하게 만들 것입니다. –

답변

2

데이터와 오류에서 알 수 있듯이 최상위 json 유형은 배열이 아니라 객체입니다. 실제로 가지고있는 것은 Unidade 요소의 배열을 가진 최상위 객체입니다. 당신은 당신의 최상위 클래스에 대해 다음과 같이 정의해야합니다 :

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

글쎄, 그 작품! 클래스에 대한 래퍼를 만드는 것이 이상하다고 생각합니다.하지만 이것이 최선의 해결책이라면 이것이 내가 할 일입니다. –

+0

@MateusViccari - json이 작성된 방법 때문입니다. jso의 최상위 레벨이 배열 인 경우에는 래퍼가 필요하지 않습니다. – jtahlborn

관련 문제