问题描述
||
我正在使用Android中的Gson库来解析JSON。
ResponseList .java
package com.hussain.classes;
import java.util.Date;
import java.util.List;
@SuppressWarnings(\"unused\")
public class ResponseList {
private List<ResponseTag> server_list;
public List<ResponseTag> getResponse() {
return server_list;
}
public void setTrends(List<ResponseTag> response) {
this.server_list = response;
}
}
ResponseTag .java
package com.hussain.classes;
public class ResponseTag {
private String ServUser;
private String ServURL;
private String CustID;
public String getName() {
return ServUser;
}
public void setName(String ServUser) {
this.ServUser = ServUser;
}
public String getUrl() {
return ServURL;
}
public void setUrl(String ServURL) {
this.ServURL = ServURL;
}
public String getCustID() {
return CustID;
}
public void setCustID(String CustID) {
this.CustID = CustID;
}
}
Main.java
package com.hussain.gjson;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URI;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import com.google.gson.Gson;
import com.hussain.classes.ResponseList;
import com.hussain.classes.ResponseTag;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try{
Log.i(\"MY INFO\",\"Json Parser started..\");
Gson gson = new Gson();
// Reader r = new InputStreamReader(getJSONData(\"http://search.twitter.com/trends.json\"));
Reader r = new InputStreamReader(getJSONData(\"http://xxxx.com\"));
Log.i(\"MY INFO\",r.toString());
ResponseList objs = gson.fromJson(r,ResponseList.class);
Log.i(\"MY INFO\",\"\"+objs.getResponse().size());
for(ResponseTag tr : objs.getResponse()){
Log.i(\"Response\",tr.getName() + \" - \" + tr.getUrl()+ \"-\"+ tr.getCustID());
}
}catch(Exception ex){
ex.printstacktrace();
}
}
public InputStream getJSONData(String url){
DefaultHttpClient httpClient = new DefaultHttpClient();
URI uri;
InputStream data = null;
try {
uri = new URI(url);
HttpGet method = new HttpGet(uri);
HttpResponse response = httpClient.execute(method);
data = response.getEntity().getContent();
} catch (Exception e) {
e.printstacktrace();
}
return data;
}
}
这三个java类在我的项目中使用。它可以完美工作并返回JSON响应,如下所示:
{\“ server_list \”:[{\“ CustID \”:\“ 23 \”,\“ ServUser \”:\“ Nathan \”,\“ ServPass \”:\“ coffee00 \”,\“ CustServersID \” :\“ 157 \”,\“ ServURL \”:\“ exp.lcgpence.com \”},]}}
但是,当我尝试使用其他URL进行相同操作时,它将无法正常工作。
在关注了来自两个不同URL的两个JSON响应之后,我发现一个独特的区别是:
{\“ sessionId \”:\“ 000ASXeEL3381100000000LCG0 \”,\“ responseCode \”:1,\“数据\”:[{\“ job_number \”:\“ 09-028 \”,\“ contract_date \”:{ },\“ project_title \”:\“代顿学区Precon \”,\“ project_manager \”:\“ Shaun Stuhldryer \”,\“ created_date \”:\“ 2009-06-11T13:22:08.000000580 \”, \“ project_name \”:\“ 09028 \”},{\“ job_number \”:\“ 09-053 \”,\“ contract_date \”:{},\“ project_title \”:\“ South Salem高中2010 Renov。\“,\” project_manager \“:\” Lee Zumwalt \“,\” created_date \“:\” 2009-11-30T14:38:43.000000573 \“,\” project_name \“:\” 09053 \“} ,{\“ job_number \”:\“ 09-011 \”,\“ contract_date \”:{},\“ project_title \”:\“ OFP新混凝土楼板-海湾4 \”,\“ project_manager \”:\ “ Jeff Perrin \”,\“ created_date \”:\“ 2009-01-19T11:12:56.000000113 \”,\“ project_name \”:\“ 09011 \”},{\“ job_number \”:\“ 08- 020 \“,\” contract_date \“:{},\” project_title \“:\” Clackamas Freezer Repair \“,\” project_manager \“:\” Paul Schulz \“,\” created_date \“:\” 2008- 04-02T11:43:40.000000050 \“, \“ project_name \”:\“ 08020 \”},{\“ job_number \”:\“ 07-018 \”,\“ contract_date \”:{},\“ project_title \”:\“ Shop Tenant Improvements LL Work \“,\” project_manager \“:\” Jason Terry \“,\” created_date \“:\” 2007-02-22T17:33:07.000000920 \“,\” project_name \“:\” 07018 \“}}]
唯一的区别是,在第二个JSON响应中,我必须使用\“ data \”并解析内部值。
在其中,第一个\“ server_list \”是唯一的标签。
如何反序列化内部\“ data \”标签?
解决方法
一个简单的解决方案是创建另一个类:
public class Whatever {
private String sessionId;
private String responseCode;
private List<ResponseTag> data;
...
}
如果反序列化第一次失败,请使用新类再次尝试。