2015-01-27 3 views
0

У меня есть приложение для Android, это приложение может обращаться к веб-службам, откликом через JSON и отправлять объект. Я хочу использовать библиотеку Gson для преобразования ответа в Object. Поэтому у меня есть этот метод, но он не работает.Как разобрать ответ с помощью Gson

 private static Impresa getDatiImpresa(String url) throws 
     IOException, MalformedURLException, JSONException 
     { 
      String result = ""; 
      Gson gson = new Gson(); 
      HttpClient client = new DefaultHttpClient(); 
      HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit 
      HttpResponse response; 
      try { 
       HttpPost post = new HttpPost(url); 
       response = client.execute(post); 

       /*Checking response */ 
       if(response!=null){ 

        InputStream source = response.getEntity().getContent(); //Get the data in the entity 
        Reader reader = new InputStreamReader(source); 
        Impresa impresa = gson.fromJson(reader, Impresa.class); 
        return impresa; 
       } 

      } catch(Exception e) { 
       e.printStackTrace(); 
       //createDialog("Error", "Cannot Estabilish Connection"); 
      } 
      return null; 
     } 

public class Impresa { 
    @SerializedName("pivaImpresa") 
    public String partitaIVA; 
    @SerializedName("ragioneSociale") 
    public String ragioneSociale; 
    @SerializedName("centriAziendali") 
    public List<CentroAziendale> listaCentroAziendale; 

    public String getPartitaIVA() { 
     return partitaIVA; 
    } 
    public void setPartitaIVA(String partitaIVA) { 
     this.partitaIVA = partitaIVA; 
    } 
    public String getRagioneSociale() { 
     return ragioneSociale; 
    } 
    public void setRagioneSociale(String ragioneSociale) { 
     this.ragioneSociale = ragioneSociale; 
    } 
    public List<CentroAziendale> getListaCentroAziendale() { 
     return listaCentroAziendale; 
    } 
    public void setListaCentroAziendale(List<CentroAziendale> listaCentroAziendale) { 
     this.listaCentroAziendale = listaCentroAziendale; 
    } 
} 

Этот метод возвращает null каждый раз.

У меня есть этот код, чтобы прочитать ответ веб-сервисов. Это код:

StringBuilder sb = new StringBuilder(); 
BufferedReader r = new BufferedReader(new InputStreamReader(new DoneHandlerInputStream(source))); 
for (String line = r.readLine(); line != null; line = r.readLine()){ 
    sb.append(line); 
} 

это реакция веб-сервисов:

{"status":1,"message":"Ok","content":[{"pivaImpresa":"05050505055","ragioneSociale":"Azienda Giustina","centriAziendali":[{"pivaImpresa":"05050505055","codiceCentroAziendale":"C001"}]}]} 
+0

Как выглядит ваш Gson? Является ли 'impresa'' null'? Или его поля 'null'? Вы посмотрели на связанные вопросы справа? –

+0

Объект «impresa» имеет значение null. И я пытаюсь запустить приложение в отладке, когда я выполняю код «.... gson.fromJson ... debug go on last row, return null; – bircastri

ответ

1

Если вы десериализуете JSON, который не совпадает с определением класса со всеми обязательными полями, Gson вернет значение null.

Так что вам нужно определить свой класс, чтобы быть таким же, как JSON:

public class JsonResponse { 
    private int status; 
    private String message; 
    private List<Impresa> content; 
} 

Определить сеттеров и это все. При десериализации его используют

JsonResponse json = gson.fromJson(reader, JsonResponse.class); 
1

Ваш JSON не совпадает с дерева объектов Java на всех.

{"status":1,"message":"Ok","content":[{"pivaImpresa":"05050505055","ragioneSociale":"Azienda Giustina","centriAziendali":[{"pivaImpresa":"05050505055","codiceCentroAziendale":"C001"}]}]} 

против

public class Impresa { 
    @SerializedName("pivaImpresa") 
    public String partitaIVA; 
    @SerializedName("ragioneSociale") 
    public String ragioneSociale; 
    @SerializedName("centriAziendali") 
    public List<CentroAziendale> listaCentroAziendale; 

Ваш JSON является объектом JSON, с полями status, message и content, где content является массив JSON, содержащий объекты JSON, которые соответствуют вашему типу Java POJO. Вам придется десериализовать тип, который имеет status, message и content поля, где content - это List или массив типа Impresa.

+0

ok, можете ли вы помочь мне применить изменения на моем class? – bircastri

+2

@bircastri Я сказал вам, что вам нужно. Я не буду писать его для вас. Что не ясно? –

+0

@bircastri Я, вероятно, не должен поощрять лень, однако, если у вас короткое время, вы можете используйте это - http: //www.jsonschema2pojo.org/Обязательно выберите JSON в качестве типа источника и Gson в качестве стиля аннотации. – Peter

0

Перейти на этот сайт http://www.jsonschema2pojo.org/

Вставить ваш ответ JSON в текстовом поле и выберите Gson для стиля аннотаций и нажмите на кнопку предварительного просмотра, чтобы просмотреть созданные файлы для вашего ответа или скачать JAR. Импортируйте все классы и выполните следующие действия для десериализации строки JSON для объекта.

JsonResponse json = gson.fromJson(reader, JsonResponse.class); 

Где JsonResponse является фактическим классом в вашей реализации. Вы оцените этот сайт, когда у вас будет сложный ответ JSON.

Надеюсь, это поможет :).

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