无法解析此多级json数据

时间:2017-06-15 11:34:32

标签: android arrays json parsing

我将字符串转换为json对象时出现空指针错误我已经尝试过gson,解析器等,但似乎没有工作。

有人可以提供低于响应的解决方案(我已经完成了子串以删除"数据:"):

data: {
"C": "abc",
"A": [{
    "B": "BcastHub",
    "C": "onData",
    "D": [{
        "ID": "1",
        "One": [{
            "Plus": 5.0,
            "Minus": 93400.0
        }, {
            "Plus": 4.9,
            "Minus": 8570.0
        }, {
            "Plus": 4.8,
            "Minus": 140606.0
        }],
        "Two": [{
            "Plus": 5.1,
            "Minus": 34.0
        }, {
            "Plus": 5.2,
            "Minus": 44622.0
        }, {
            "Plus": 5.3,
            "Minus": 2408.0
        }]
    }]
}]

}

我的获取代码

try{
URL urlData = new URL(url);
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    urlData.openConnection().getInputStream(), "utf-8"));
            String struct = reader.readLine();

            while ((struct = reader.readLine()) != null ) {
                if(!struct.equals("")) {
                    struct = struct.substring(6,struct.length());
                    JSONParser parser = new JSONParser();
                    JSONObject lev1  =(JSONObject) parser.parse(struct);
                    //JSONObject lev1 = (JSONObject) obj;

                    JSONObject parent = (JSONObject) lev1.get("A");

                    for(int j=0;j<parent.length();j++) {

                        JSONObject child1 = (JSONObject) parent.get("D");
                        JSONArray child2 = (JSONArray) child1.get("One");

                        for (int i = 0; i < child2.length(); i++) {

                            JSONObject item = child2.getJSONObject(i);
                            final String plus = item.getString("Plus");
                            final String minus = item.getString("Minus");

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    tv.setText("Plus => " + plus + "Minus = > " + minus);
                                }
                            });
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

告诉我你是否还想要其他东西。感谢。

编辑:我正在修剪字符串的开头,以使其格式正确,然后将字符串转换为JSONObject给我错误。在JSONObject parent =(JSONObject)lev1.get(&#34; A&#34;);因为lev1为空。

3 个答案:

答案 0 :(得分:1)

只需将您的json数据放在jsonString中,可以使用jsonString。

 try {
        JSONObject mainObject=new JSONObject(jsonString);
        System.out.println(mainObject.toString());

        System.out.println("// First Level object(s)");
        System.out.println("C--> "+mainObject.getString("C"));// First Level object C
        JSONArray firstArray=mainObject.getJSONArray("A");
        for(int i=0;i<firstArray.length();i++){ //First Level Array A
            JSONObject arrayObject =firstArray.getJSONObject(i);
            System.out.println("// Second Level object(s)");
            System.out.println("B--> "+arrayObject.getString("B")); // Second Level Object B
            System.out.println("C--> "+arrayObject.getString("C")); // Second Level Object C

            System.out.println("//Second Level Array D");
            JSONArray secondLevelArray=arrayObject.getJSONArray("D");
            for(int j=0;j<secondLevelArray.length();j++){
                JSONObject innerArrayObject=secondLevelArray.getJSONObject(j);
                System.out.println("// Third Level object(s) ");
                System.out.println("ID --> "+innerArrayObject.getString("ID"));
                JSONArray thirlLevelArray1=innerArrayObject.getJSONArray("One");
                for(int k=0;k<thirlLevelArray1.length();k++){
                    JSONObject innerMostObjects=thirlLevelArray1.getJSONObject(k);
                    System.out.println("Plus -->"+innerMostObjects.get("Plus"));
                    System.out.println("Minus -->"+innerMostObjects.get("Minus"));

                }
                JSONArray thirlLevelArray2=innerArrayObject.getJSONArray("Two");
                for(int k=0;k<thirlLevelArray2.length();k++){
                    JSONObject innerMostObjects=thirlLevelArray2.getJSONObject(k);
                    System.out.println("Plus -->"+innerMostObjects.get("Plus"));
                    System.out.println("Minus -->"+innerMostObjects.get("Minus"));

                }
            }

        }


    } catch (JSONException e) {
        e.printStackTrace();
    }

答案 1 :(得分:1)

try {
            jsonResponse = new JSONObject(strJson2);
            JSONObject user = jsonResponse.getJSONObject("data");
            num = user.getString("C");

            JSONArray user1 = user.getJSONArray("A");

            for (int i = 0; i < user1.length(); i++) {
                jsonChildNode = user1.getJSONObject(i);
                String B = jsonChildNode.getString("B");
                String c2 = jsonChildNode.getString("C");

                Toast.makeText(this, B + "::" + c2.toString(), Toast.LENGTH_SHORT).show();

                JSONArray jsonArraysunject = jsonChildNode.getJSONArray("D");

                for (int j = 0; j < jsonArraysunject.length(); j++) {
                    JSONObject DD = jsonArraysunject.getJSONObject(j);
                    String dd = DD.getString("ID");
                    Toast.makeText(this, dd.toString(), Toast.LENGTH_SHORT).show();

                    One = DD.getJSONArray("One");

                    for (int k = 0; k < One.length(); k++) {

//                        for (int i = 0; i < lengthJsonArr; i++) {
                        jsonChildNodeo = One.getJSONObject(k);
                        type = jsonChildNodeo.getString("Plus");
                        num = jsonChildNodeo.getString("Minus");

                        makeText.add("Plus - " + type);


                        makeText.add("Minus - " + num);

                        Toast.makeText(this, makeText.toString(), Toast.LENGTH_SHORT).show();



                    }
                    Toast.makeText(this, "hdjeh", Toast.LENGTH_SHORT).show();

                    Two = jsonChildNodeo.getJSONArray("Two");


                    Toast.makeText(this, Two.toString(), Toast.LENGTH_SHORT).show();
                    for (int r = 0; r < Two.length(); r++) {
                        JSONObject tw = Two.getJSONObject(r);
                        String tplus = tw.getString("Plus");
                        String tminus = tw.getString("Minus");
                        makeText2.add("plus - " + tplus);
                        makeText2.add("minus - " + tminus);
                        Toast.makeText(this, makeText2.toString(), Toast.LENGTH_SHORT).show();
//                        }

                    }

                }

答案 2 :(得分:0)

我使用Gson解析了您的数据。先前讨论了The advantages of Gson。此外,您还可以查看goals of Gson

以下是使用Gson解析数据的方法:

  

请注意,我没有使用代码格式标准(例如,类的名称应该使用CamelCase),因为您无法共享实际数据。

提取JSON字符串:

提取JSON字符串时使用indexOf(int)而不是硬编码6。

jsonString = jsonString.substring(jsonString.indexOf("{"));

<强>解析:

Gson gson = new Gson();
data d = gson.fromJson(reader, data.class);

for (a a1 : d.A) {
    for (plusminus pm : a1.D[0].One) {
        System.out.println("Plus => " + pm.Plus + " Minus => " + pm.Minus);
    }
}

必修课程:

public class data {
    public String C;
    public a A[];
}

public class a {
    public String B;
    public String C;
    public d D[];
}       

public class d {
    public int ID;
    public plusminus One[], Two[];
}

public class plusminus {
    public double Plus;
    public double Minus;
}