如何使用 Gson 解析响应

How to parse response with Gson

我有一个 Android 应用程序,此应用程序可以联系网络服务,通过 JSON 进行响应并发送一个对象。我想使用 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;
    }
}

此方法 return 每次都无效。

我已经使用这段代码来读取网络服务的响应。 这是代码:

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"}]}]}

您的 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 对象,具有字段 statusmessagecontent,其中 content 是一个 JSON 包含 JSON 个与您的 Java POJO 类型匹配的对象的数组。您必须反序列化为具有 statusmessagecontent 字段的类型,其中 contentList 或 [=21= 类型的数组].

如果你反序列化一个 JSON 与 class 定义不同的所有必填字段,Gson 将 return null。

因此您需要将 class 定义为与 JSON 相同:

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

定义二传手,仅此而已。 反序列化时使用

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

转到此站点 http://www.jsonschema2pojo.org/

将您的 JSON 响应粘贴到文本框中,并在注释样式中粘贴 select Gson,然后单击预览查看为您的响应生成的文件或下载 JAR。导入所有 classes 并执行以下操作以将 JSON 字符串反序列化为对象。

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

其中 JsonResponse 是您实施中的实际 class。当您有复杂的 JSON 响应时,您会喜欢这个网站。

希望对您有所帮助:)。