【问题标题】:Json array parsing always has null result in AndroidJson数组解析在Android中总是有空结果
【发布时间】:2017-05-05 09:57:26
【问题描述】:

如何解析这个 json 数组?

{"1":
{"0":"3","id_disc":"3","1":"Дослідження і проектування компютерних систем","name":"Дослідження і проектування компютерних систем","2":"ДПКМС ","s_name":"ДПКМС "}
,"2":
{"0":"5","id_disc":"5","1":"Цивільний захист і охорона праці в галузі","name":"Цивільний захист і охорона праці в галузі","2":"ЦЗ і ОП","s_name":"ЦЗ і ОП"}
,"3":
{"0":"1","id_disc":"1","1":"Дослідження і проектування  інтелектуальних систем (Лекція)","name":"Дослідження і проектування  інтелектуальних систем (Лекція)","2":"ДіПІС","s_name":"ДіПІС"}
}

我正在尝试这种方法,但我总是得到空结果。

String[] sA = new String[100];
try {
    JSONArray cast = getDisc(paraaams).getJSONArray(" ");
    for (int i=0; i<cast.length(); i++) {
        JSONObject disc = cast.getJSONObject(i);
        sA[i-1] = disc.getString("name");
    }
}catch (JSONException e){}


           // sA[0]=getDisc(paraaams).toString();

     ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1, sA);

        listView.setAdapter(adapter);

public JSONArray getDisc(Object params[]){
        HTTPWorker httpWorker=new HTTPWorker();
            JSONArray mjson =new JSONArray();
        String s = httpWorker.doInBackground(params);
try {
    mjson = new JSONArray(s);
    Log.e("JSONinClass ",mjson.toString());

}catch (JSONException e){}

        return mjson;

我想我尝试像 json 对象一样解析它,但我不知道如何正确使用 json 数组。

感谢您的帮助:)

我的 ListFragment:

public class MyFilesActivity extends android.app.Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_myfiles, null);

        ListView listView = (ListView) rootView.findViewById(R.id.listView);
        String[] sA = new String[100];

        JSONObject jsonObject = null;
        try {
            jsonObject = new JSONObject(getDisc(paraaams).toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        int i =0;
        Iterator<String> iterator = jsonObject.keys();
        while (iterator.hasNext()) {
            String key = iterator.next();
            try {
                if (jsonObject.has(key)) {
                    JSONObject value = jsonObject.getJSONObject(key);
                    // value is another JSONObject where you can get the "name" from
                        String name = value.getString("name");
                    sA[i]=name;
                        Log.e("value= ", name);
                    i+=1;
                }
            } catch (JSONException e) {
                // Something went wrong!
                e.printStackTrace();
            }
        }
           // sA[0]=getDisc(paraaams).toString();
     ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1, sA);
        listView.setAdapter(adapter);
    return rootView;
    }

我删掉了一点,删除它对这个问题并不重要:)

【问题讨论】:

  • 您将 JSONObject 放入 json 数组,因此它返回 null...
  • 它不是数组而是对象
  • JSONObject 包含在 { }JSONArray[ ]
  • 谢谢,我明白了

标签: android arrays json


【解决方案1】:

试试这个来响应 Parse

可以帮助你

try{
      JSONObject jsonObject = new JSONObject(response);
      List<String> keyList = getAllKeys(jsonObject);
      for(String key : keyList){
          JSONObject innerObject = jsonObject.getJSONObject(key);
          List<String> innerKeyList = getAllKeys(innerObject);
          for(String innerKey: innerKeyList){
              System.out.println(innerObject.getString(innerKey));
          }
      }
    }catch(Exception e){
        e.printStackTrace();
    }

此方法将返回键

private List<String> getAllKeys(JSONObject jsonObject) throws JSONException{
    List<String> keys = new ArrayList<String>();

    Iterator<?> iterator = jsonObject.keys();
      while( iterator.hasNext() ) {
          String key = (String)iterator.next();
          keys.add(key);
      }
      return keys;
}

【讨论】:

    【解决方案2】:

    试试这个:

    please check below changes replace array to arraylist
    
    
    
      public class MyFilesActivity extends android.app.Fragment {
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.activity_myfiles, null);
    
                ListView listView = (ListView) rootView.findViewById(R.id.listView);
                ArrayList<String> sA = new ArrayList<>();
    
                JSONObject jsonObject = null;
                try {
                    jsonObject = new JSONObject(getDisc(paraaams).toString());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
    
                Iterator<String> iterator = jsonObject.keys();
                while (iterator.hasNext()) {
                    String key = iterator.next();
                    try {
                        if (jsonObject.has(key)) {
                            JSONObject value = jsonObject.getJSONObject(key);
                            // value is another JSONObject where you can get the "name" from
                                String name = value.getString("name");
                            sA.add(name);
                                Log.e("value= ", name);
    
                        }
                    } catch (JSONException e) {
                        // Something went wrong!
                        e.printStackTrace();
                    }
                }
                   // sA[0]=getDisc(paraaams).toString();
             ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                        android.R.layout.simple_list_item_1, sA);
                listView.setAdapter(adapter);
            return rootView;
            }
    

    【讨论】:

    • 我无法更改此响应,它在工作系统的网络服务器上。
    • 谢谢,它可以工作,但我已经把它放在列表片段中了:(
    • 很高兴它成功了。请接受我的回答。您也可以访问:stackoverflow.com/tour 以获取有关 SO 的更多信息并尽可能多地支持我。
    • 把你的列表片段放在这里
    • ArrayList 是一个天才的想法,谢谢,它有效!呃,我还有很多东西要学)
    【解决方案3】:

    这是一个解析json的测试代码。

     try {
            JSONObject json = new JSONObject(json);
            int jsonLength = json.length();
    
            for(int i=1; i<=jsonLength; i++){
    
                JSONObject jObject = json.getJSONObject(""+i);
    
                String data = jObject.getString("0");
            }
    
        } catch (JSONException e) {
            e.printStackTrace();
        }
    

    【讨论】:

      【解决方案4】:

      它只是一个普通的 JSONObject 而不是 JSONArray,所以你必须先将它转换为 JSONObject

      JSONObject json = new JSONObject(jsonString);

      遍历它

      for (Iterator<String> iter = json.keys(); iter.hasNext();) {
          String key = iter.next();
          JSONObject value = (JSONObject) json.getJSONObject(key);
          String name = value.getString("name");
      }
      

      【讨论】:

      • JSONObject 值 = json.get(key);它需要 JSONObject,但找到了 java.lang.object
      • @Максим Райлян 更改代码 JSONObject value = json.get(key);使用 JSONObject 值 = (JSONObject)json.get(key);也行
      • @KeyurThumar java.lang.NullPointerException: 尝试在空对象引用上调用虚拟方法 'java.lang.String java.lang.Object.toString()':( 它仍然为空
      • @МаксимРайлян 你能用我更新的答案再试一次吗
      • @МаксимРайлян 使用我在下面添加的答案中的代码。它是用有问题的 json 格式测试的。
      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2020-12-30
      • 2016-03-31
      相关资源
      最近更新 更多