如何使用 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 对象,具有字段 status
、message
和 content
,其中 content
是一个 JSON 包含 JSON 个与您的 Java POJO 类型匹配的对象的数组。您必须反序列化为具有 status
、message
和 content
字段的类型,其中 content
是 List
或 [=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 响应时,您会喜欢这个网站。
希望对您有所帮助:)。
我有一个 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 对象,具有字段 status
、message
和 content
,其中 content
是一个 JSON 包含 JSON 个与您的 Java POJO 类型匹配的对象的数组。您必须反序列化为具有 status
、message
和 content
字段的类型,其中 content
是 List
或 [=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 响应时,您会喜欢这个网站。
希望对您有所帮助:)。