我有一个类来解析嵌套的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 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()));
我的问题是我在logcat上有一个警告。 00571564&#39;的值在TAG_NOPOL上,但为什么它能够显示json数据。这是我的logcat
12-29 11:30:37.064: D/Vehicle JSON:(1246): > [{"DivisionID":"2c0e9dc1-a6a7-4e38-b93f-2e158c4deffd","DivisionName":"Telto","SubDivision":[{"SubDivisionID":"70c3ac53-eec6-4ca3-94aa-5a73109597f6","SubDivisionName":"FM2200","Vehicle":[{"Nopol":"00571564","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.8082176,"LastLat":-6.2304376,"Location":"TULODONG ATAS-CPN Office","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848020936627","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.808208,"LastLat":-6.230759,"Location":"SENOPATI-APOTIK SENOPATI","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848020975237","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.8082368,"LastLat":-6.230522,"Location":"SENOPATI-CPN Office","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848020990939","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.8082112,"LastLat":-6.2305936,"Location":"SENOPATI-APOTIK SENOPATI","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848021061888","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.80819138805734,"LastLat":-6.2301388574162653,"Location":"TULODONG ATAS-APOTIK SENOPATI","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848021107434","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.8082816,"LastLat":-6.2305712,"Location":"SENOPATI-APOTIK SENOPATI","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848021109521","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":116.0763392,"LastLat":-8.5707216,"Location":"-","Kecamatan":"AMPENAN","Kabupaten":"KOTA MATARAM"},{"Nopol":"352848021112277","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":2.0,"LastLon":106.808208,"LastLat":-6.230759,"Location":"SENOPATI-APOTIK SENOPATI","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848021112285","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.808208,"LastLat":-6.230759,"Location":"SENOPATI-APOTIK SENOPATI","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848021279498","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.8081792,"LastLat":-6.2305036,"Location":"","Kecamatan":"","Kabupaten":""},{"Nopol":"352848021405093","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.80832,"LastLat":-6.2306388,"Location":"SENOPATI-parkiran motor CPN","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"352848021414749","LastUpdate":"Oct 29 2013 2:22PM","LastSpeed":0.0,"LastLon":106.8083136,"LastLat":-6.2305384,"Location":"SENOPATI-parkiran motor CPN","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"570388","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.6985856,"LastLat":-6.0790272,"Location":"DESA KOSAMBI-","Kecamatan":"KOSAMBI","Kabupaten":"KAB. TANGERANG"},{"Nopol":"570393","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.8082688,"LastLat":-6.2306024,"Location":"SENOPATI-parkiran motor CPN","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"570399","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":107.101568,"LastLat":-6.297048,"Location":"KALIMANTAN-Rute_001","Kecamatan":"CIKARANG BARAT","Kabupaten":"KAB. BEKASI"},{"Nopol":"570739","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.8084096,"LastLat":-6.230694,"Location":"SENOPATI-parkiran motor CPN","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"570846","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.6987584,"LastLat":-6.0790624,"Location":"DESA KOSAMBI-","Kecamatan":"KOSAMBI","Kabupaten":"KAB. TANGERANG"},{"Nopol":"571155","LastUpdate":"Oct 25 2013 3:46PM","LastSpeed":0.0,"LastLon":106.8083264,"LastLat":-6.2305592,"Location":"SENOPATI-parkiran motor CPN","Kecamatan":"KEBAYORAN BARU","Kabupaten":"JAKARTA SELATAN"},{"Nopol":"571464","LastUpdate":"Oct 10 2010 10:10AM","LastSpeed":0.0,"LastLon":106.80819138805734,"LastL
12-29 11:30:37.134: D/handle(1246): JSONException Handled
12-24 10:21:10.068: W/System.err(1487): org.json.JSONException: No value for 00571564
12-24 10:21:10.068: W/System.err(1487): at org.json.JSONObject.get(JSONObject.java:354)
12-24 10:21:10.068: W/System.err(1487): at org.json.JSONObject.getString(JSONObject.java:510)
12-24 10:21:10.068: W/System.err(1487): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-24 10:21:10.079: W/System.err(1487): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
12-24 10:21:10.079: W/System.err(1487): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
12-24 10:21:10.079: W/System.err(1487): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
12-24 10:21:10.079: W/System.err(1487): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
12-24 10:21:10.079: W/System.err(1487): at android.os.Handler.dispatchMessage(Handler.java:99)
12-24 10:21:10.092: W/System.err(1487): at android.os.Looper.loop(Looper.java:130)
12-24 10:21:10.092: W/System.err(1487): at android.app.ActivityThread.main(ActivityThread.java:3683)
12-24 10:21:10.092: W/System.err(1487): at java.lang.reflect.Method.invokeNative(Native Method)
12-24 10:21:10.092: W/System.err(1487): at java.lang.reflect.Method.invoke(Method.java:507)
12-24 10:21:10.092: W/System.err(1487): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-24 10:21:10.098: W/System.err(1487): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-24 10:21:10.098: W/System.err(1487): at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:0)
问题是您使用TAG常量来设置
中的值I.E:TAG_NOPOL将持有该字段的JSON-KEY,这是&#34; Nopol&#34;
稍后,在您的代码中,您使用JSON
中的值设置该标记的值 setnoPol(veh.getString(TAG_NOPOL));
你可以看到:
public void setnoPol (String nopol) {
this.TAG_NOPOL = nopol;
}
setnoPol()将值存储在TAG变量...
中请注意veh.getString(TAG_NOPOL)
这会导致==&gt; setnoPol(veh.getString("00571564"));
你会得到那个错误......
这是错误的。 标签将保存字段的键名,类中的另一个字段应保存该值。
所以下次尝试使用TAG_NOPOL读取jsonObject时,它会尝试使用键00571564
找到json中的值,这是一个 VALUE ,所以这里得到错误。
最佳做法是将您的KEY-Names(TAGS)定义为最终
private static final String TAG_NOPOL = "Nopol";
并且您需要拥有其他类成员来保存这些键的值。 所以你使用TAG常量从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;
}
:
:
: