Android在Logcat上解析嵌套的JsonArray警告

时间:2014-12-24 03:54:41

标签: 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 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)

1 个答案:

答案 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;
}
:
:
:
相关问题