【问题标题】:Can not parse this multilevel json data无法解析这个多级 json 数据
【发布时间】:2017-11-17 21:16:30
【问题描述】:

在将字符串转换为 json 对象时出现空指针错误,我尝试过 gson、parser 等,但似乎都没有工作。

有人可以为以下响应提供解决方案(我已经完成子字符串以删除“数据:”):

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 父 = (JSONObject) lev1.get("A");因为 lev1 为空。

【问题讨论】:

  • 您的 Json 响应错误 在此处验证您的 Json 响应 jsoneditoronline.org
  • 我知道我从一开始就修剪了数据,直到我在问题中提到的'{',然后将字符串转换为给我 NPE 的 json 对象。
  • 给出你回复的网址,这样我可以更好地帮助你
  • 嗯,出于安全原因,这是不可能的......但如果你能为这种格式提供解决方案,那么这就是数据的确切格式,那么它会很棒。
  • 好的,那我去看看

标签: android arrays json parsing


【解决方案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】:

    只需将您的 json 数据放在 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();
        }
    

    【讨论】:

    • 不得不做一些调整,但最后帮了我很多...谢谢大家的欢呼
    【解决方案3】:

    我使用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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多