当前位置: 代码迷 >> java >> 尝试在Android中解析JSON
  详细解决方案

尝试在Android中解析JSON

热度:42   发布时间:2023-07-17 20:36:24.0

您如何建议我解析此JSON:

{"17": {"user_name": "test1"}, "18": {"user_name": "test5"}, "19": {"user_name": "test9"}}

我需要获取“用户名”,但是我找不到方法。 也许我应该将JSON更改为类似的内容:

[{"user_name": "test1"},{"user_name": "test5"},{"user_name": "test9"}]

这样,我尝试获取“ user_name”:

try {
        List<String> allNames = new ArrayList<String>();
        String str = "[{"user_name": "test1"},{"user_name": "test5"},{"user_name": "test9"}]";
        JSONObject json = new JSONObject(str);

            for ( int i = 0; i < json.length() ; i++)
            {
                JSONObject actor = json.getJSONObject(i);
                String user_name = actor.getString("user_name");
                allNames.add(user_name);
            }

} catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

但是然后我得到那条线的问题:

JSONObject actor = json.getJSONObject(i);

Android Studio告诉我JSONObject无法应用于int(i)。 我不知道为什么它不起作用。

有人可以给我一些提示,教程或示例吗?

非常感激 !

Android Studio告诉我JSONObject无法应用于int(i)

因为JSONObject.getJSONObject方法将键名作为String而不是int 并且发布的json中的键是17,18,...以访问内部JSONObject

要获得所有user_name从JSONObject的,需要得到所有的键:

Iterator<String> iter = json.keys();
while (iter.hasNext()) {
   String key = iter.next();
   JSONObject actor = json.getJSONObject(key);
   String user_name = actor.getString("user_name");
   allNames.add(user_name);
}

方法需要一个String参数(对象的名称或键),而不是int 在您的情况下,键为"17""18""19" 要获取所有密钥,请使用方法:

JSONObject json = new JSONObject(str);
Iterator<String> keyIterator = json.keys();
while (keyIterator.hasNext()) {
  JSONObject actor = json.getJSONObject(keyIterator.next());
  String user_name = actor.getString("user_name");
  allNames.add(user_name);
}

像这样更改代码

try {
    List<String> allNames = new ArrayList<String>();
    String str = "[{"user_name": "test1"},{"user_name": "test5"},{"user_name": "test9"}]";

    JSONOArray jsonArray = new JSONOArray(str);

        for ( int i = 0; i < jsonArray .length() ; i++)
        {
            JSONObject actor = jsonArray.getJSONObject(i);
            String user_name = actor.getString("user_name");
            allNames.add(user_name);
        }

} catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
str = {"17": {"user_name": "test1"}, "18": {"user_name": "test5"}, "19": {"user_name": "test9"}}
JSONObject ob1 = new JSONObject(str)
JSONObject ob2 = ob1.getJSONObject("17");
String userName = ob2.getString("user_name");


str = [{"user_name": "test1"},{"user_name": "test5"},{"user_name": "test9"}]
List<String> allNames = new ArrayList<String>();
JSONArray jsonArray = new JSONArray("str");
for(i=0; i < jsonArray.length(); i++){
    JSONObject ob = jsonArray.getJSONObject(i);
    allNames.add(ob.getString("user_name")
}

如果您使用Gson库,则非常简单。

    String json = "{\"17\": {\"user_name\": \"test1\"}, \"18\": {\"user_name\": \"test5\"}, \"19\": {\"user_name\": \"test9\"}}";
    Gson gson = new GsonBuilder().create();
    Map<String,User> users = gson.fromJson(json, new TypeToken<Map<String,User> >(){}.getType());
    for(String key : users.keySet()) {
        Log.d("DEBUG",key+" -> "+users.get(key).getUser_name());
    }

User类是一个简单的POJO,例如:

公共类用户{

private String user_name;

public String getUser_name() {
    return user_name;
}

public void setUser_name(String user_name) {
    this.user_name = user_name;
}

}

您正在尝试将JSONArray解析为JSONObject

JSONObject json = new JSONObject(str); 

使用下面的代码.....

try {
        List<String> allNames = new ArrayList<String>();
        String str = "[{"user_name": "test1"},{"user_name": "test5"},{"user_name": "test9"}]";
        JSONArray json = new JSONArray(str);

            for ( int i = 0; i < json.length() ; i++)
            {
                JSONObject actor = json.getJSONObject(i);
                String user_name = actor.getString("user_name");
                allNames.add(user_name);
            }

} catch (JSONException e) {
            // TODO Auto-generated catch block`enter code here`
            e.printStackTrace();
        }