Android解析Logcat上的嵌套JsonArray警告
我有一个类来解析嵌套的jsonarray。我已经能够显示json数据。这就是我解析嵌套json的方式Android解析Logcat上的嵌套JsonArray警告,android,json,android-listview,arrays,Android,Json,Android Listview,Arrays,我有一个类来解析嵌套的jsonarray。我已经能够显示json数据。这就是我解析嵌套json的方式 private static String DIV_ID = "DivisionID"; private static String DIV_NAME = "DivisionName"; private static String SUBDIV_ID = "SubDivisionID"; private static String SUBDIV_NAME = "SubDivisionName";
private static String DIV_ID = "DivisionID";
private static String DIV_NAME = "DivisionName";
private static String SUBDIV_ID = "SubDivisionID";
private static String SUBDIV_NAME = "SubDivisionName";
private static String TAG_NOPOL = "Nopol";
private static String TAG_LOCATION = "Location";
private static String TAG_LONG = "LastLon";
public String getDivisionID() {
return DIV_ID;
}
public void setDivID (String divisionId) {
this.DIV_ID = divisionId;
}
public String getDivisionName()
{
return DIV_NAME;
}
public void setDivName(String divisionName)
{
this.DIV_NAME = divisionName;
}
public String getSubdivID() {
return SUBDIV_ID;
}
public void setSubdivID(String subdivisionId) {
this.SUBDIV_ID = subdivisionId;
}
public String getSubdivName() {
return SUBDIV_NAME;
}
public void setSubdivName(String SubdivisionName) {
this.SUBDIV_NAME = SubdivisionName;
}
public String getnoPol() {
return TAG_NOPOL;
}
public void setnoPol (String nopol) {
this.TAG_NOPOL = nopol;
}
public String getLocate() {
return TAG_LOCATION;
}
public void setLocate(String location) {
this.TAG_LOCATION = location;
}
public String getLastlon() {
return TAG_LONG;
}
public void setLastlon(String lastlon) {
this.TAG_LONG = lastlon;
}
// JSON url
public static final String API_GET_VEHICLE = "http://example.com/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
// ListView reference
mLinearListView = (LinearLayout)findViewById(R.id.linear_listview);
Log.d(TAG, "tes : " + Access.API_GET_VEHICLE);
ArrayList<ItemList> mItemListArray=new ArrayList<ItemList>();
pSubItemArrayList=new ArrayList<SubCategory>();
pProductArrayList=new ArrayList<Product>();
List<NameValuePair> params = new ArrayList<NameValuePair>();
ServiceHandler sh = new ServiceHandler();
// Making a request to url and getting response
String jsonStr = sh.makeServiceCall(API_GET_VEHICLE , ServiceHandler.GET);
// Check your log cat for JSON response
Log.d("Vehicle JSON: ", "> " + jsonStr);
try {
Divi = new JSONArray(jsonStr);
// looping through All data
for (int i = 0; i < Divi.length(); i++) {
JSONObject c = Divi.getJSONObject(i);
// Storing each json item values in variable
setDivID(c.getString(DIV_ID));
setDivName(c.getString(DIV_NAME)) ;
SDiv = new JSONArray();
//if (SDiv != null) {
JSONArray SDiv = c.getJSONArray("SubDivision");
for (int j=0; j<SDiv.length(); j++) {
JSONObject sub = SDiv.getJSONObject(j);
setSubdivID(sub.getString(SUBDIV_ID));
setSubdivName(sub.getString(SUBDIV_NAME));
Vehic = new JSONArray();
//if (Vehic != null) {
JSONArray Vehic = sub.getJSONArray("Vehicle");
for (int k=0; k<Vehic.length(); k++)
{
JSONObject veh = Vehic.getJSONObject(k);
setnoPol(veh.getString(TAG_NOPOL));
setLocate(veh.getString(TAG_LOCATION));
setLastlon(veh.getString(TAG_LONG));
}
}
}
} catch (JSONException e) {
Log.d("handle","JSONException Handled");
e.printStackTrace();
}
pProductArrayList.add(new Product(getDivisionName(), pSubItemArrayList));
pSubItemArrayList.add(new SubCategory(getSubdivName(), mItemListArray));
mItemListArray.add(new ItemList(getnoPol(), getLocate(), getLastlon()));
mItemListArray.add(new ItemList(getnoPol(), getLocate(), getLastlon()));
问题是您正在使用标记常量来设置内部的值 即:TAG_NOPOL将保存该字段的JSON键,该字段为“NOPOL” 稍后,在代码中,使用JSON中的值设置该标记的值
setnoPol(veh.getString(TAG_NOPOL))代码>
如你所见:
public void setnoPol (String nopol) {
this.TAG_NOPOL = nopol;
}
setnoPol()将值存储在标记变量中
注意veh.getString(TAG_NOPOL)
这将导致==>setnoPol(veh.getString(“00571564”)代码>您将得到该错误
这是错误的。
标记将保存字段的键名,类中的另一个字段将保存该值
因此,下次您尝试使用TAG_NOPOL从jsonObject读取时,它将尝试在json中找到一个键为00571564
的值,这是一个值,因此您得到了错误
最佳实践是将密钥名(标记)定义为final
您需要有其他类成员来保存这些键的值。
因此,您可以使用标记常量读取jsonObject,并将其存储在适当的类成员中
您的类应该如下所示:
private static final String DIV_ID = "DivisionID";
private static final String DIV_NAME = "DivisionName";
private static final String SUBDIV_ID = "SubDivisionID";
private static final String SUBDIV_NAME = "SubDivisionName";
private static final String TAG_NOPOL = "Nopol";
private static final String TAG_LOCATION = "Location";
private static final String TAG_LONG = "LastLon";
//NO SETTERS GETTERS FOR TAG VALUES (THEY ARE FINAL)
private String divId = "";
private String divName = "";
private String subDivId = "";
//GETTERS AND SETTER HERE FOR THE variables above (Not for the TAG_xx)
public void setDivId(String id){
this.divId = id;
}
:
:
:
你能发布完整的日志吗?你能发布你的JSON吗?
private static final String TAG_NOPOL = "Nopol";
private static final String DIV_ID = "DivisionID";
private static final String DIV_NAME = "DivisionName";
private static final String SUBDIV_ID = "SubDivisionID";
private static final String SUBDIV_NAME = "SubDivisionName";
private static final String TAG_NOPOL = "Nopol";
private static final String TAG_LOCATION = "Location";
private static final String TAG_LONG = "LastLon";
//NO SETTERS GETTERS FOR TAG VALUES (THEY ARE FINAL)
private String divId = "";
private String divName = "";
private String subDivId = "";
//GETTERS AND SETTER HERE FOR THE variables above (Not for the TAG_xx)
public void setDivId(String id){
this.divId = id;
}
:
:
: