如何解析 JSON 数组对象?

Posted

技术标签:

【中文标题】如何解析 JSON 数组对象?【英文标题】:How to parse a JSON Array Object? 【发布时间】:2019-12-01 09:39:18 【问题描述】:

我正在尝试在 android 上为 ListView 获取 JSON 数组,但目前还做不到。

我的 JSON 是这样的

[
   
      "iD":1,
      "name":"name1"
   ,
   
      "iD":2,
      "name":"name2"
   ,
   
      "iD":3,
      "name":"name3"
   ,
   
      "iD":4,
      "name":"name4"
   
]

也试试这第二种 JSON 格式


   "userdata":[
      
         "iD":1,
         "name":"name1"
      ,
      
         "iD":2,
         "name":"name2"
      ,
      
         "iD":3,
         "name":"name3"
      ,
      
         "iD":4,
         "name":"name4"
      
   ]

我的 Java 看起来像

     private void loadIntoListView(String json) throws JSONException 
            Log.e("log1 = ", json);

            JSONArray jsonArray = new JSONArray(json);
            Log.e("log2 = ","5" );  //Integer.toString(jsonArray.length())
            String[] heroes = new String[jsonArray.length()];

            for (int i = 0; i < jsonArray.length(); i++) 
                JSONObject obj = jsonArray.getJSONObject(i);
                heroes[i] = obj.getString("name");
            
            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, heroes);
            listView.setAdapter(arrayAdapter);
        

     private void loadIntoListView(String json) throws JSONException 
        Log.e("result 2 = ", json);

        JSONObject entries = new JSONObject(json);
        JSONArray jsonArray = entries.getJSONArray("userdata");

        Log.e("length = ","5" );  //Integer.toString(jsonArray.length())
        String[] heroes = new String[jsonArray.length()];

        for (int i = 0; i < jsonArray.length(); i++) 
            JSONObject obj = jsonArray.getJSONObject(i);
            heroes[i] = obj.getString("name");
        
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, heroes);
        listView.setAdapter(arrayAdapter);
    

我看到了第一个日志,但我看不到第二个。另外,我无法获得ListView 的名称。

require_once('connection.php');

$heroes = array(); 
$sql = "SELECT iD, name FROM valTable;";
$stmt = $conn->prepare($sql);
$stmt->execute();

$stmt->bind_result($id, $name);

while($stmt->fetch())

    $temp = [
        'iD'=>$id,
        'name'=>$name
    ];

    array_push($heroes, $temp);


echo json_encode($heroes);

【问题讨论】:

日志 1 中打印了什么? @Athira ["iD":1,"name":"name1","iD":2,"name":"name2","iD":3, "name":"name3","iD":4,"name":"name4"] 我在 log1 上看到我的 JSON 字符串没有问题 How to parse JSON Array (Not Json Object) in Android的可能重复 你的错误是什么?请分享您的错误。 我还在寻找 【参考方案1】:

您应该使用诸如Gson 之类的 JSON 库来为您解析这些对象。

添加你的 gradle 依赖项

  implementation 'com.google.code.gson:gson:2.8.5'

你可以像这样创建对象

data class JsonRootObject(val userdata: List<User>)

data class User(val iD:Int, val name:String)

然后解析你的对象

val myParsedObject = Gson().fromJson(jsonString, JsonRootObject::class.java);

确保您的字段名称与正在解析的对象相同,这也意味着区分大小写。如果您想更改他们的映射名称,您可能需要使用 @SerializedName("id") 注释,例如

class User 

  @SerializedName("id")
  lateinit var id: Int

  @SerializedName("my_name")
  lateinit var name: String  


考虑你的第二个对象的这个答案


   "userdata":[
      
         "iD":1,
         "name":"name1"
      ,
      
         "iD":2,
         "name":"name2"
      ,
      
         "iD":3,
         "name":"name3"
      ,
      
         "iD":4,
         "name":"name4"
      
   ]

当然,所有这些都是用 Kotlin 编写的。

【讨论】:

可以用Java给出这个例子吗? 你有一个重复的***.com/questions/18977144/… 这是一个 Java 示例***.com/a/23862104/1573036 - 每当询问有关堆栈溢出的问题时,请确保它不存在。 两个链接都没有成功。第一个和我的一样,但我不明白我的错在哪里。它似乎在 JSON 数组中,但请检查我的 php.ini 文件。我还是看不到。【参考方案2】:

使用 try catch 代替 throws

    try 

        JSONArray jsonArray = new JSONArray(json);
        Log.e("log2 = ", "5");  //Integer.toString(jsonArray.length())
        String[] heroes = new String[jsonArray.length()];

        for (int i = 0; i < jsonArray.length(); i++) 
            JSONObject obj = jsonArray.getJSONObject(i);
            heroes[i] = obj.getString("name");
        
 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, heroes);
        listView.setAdapter(arrayAdapter);
    
    catch (Exception e)
    
        Log.e("log3 = ", ""+e);
    

【讨论】:

我在 log3 org.json.JSONException 上得到了这个:java.lang.String 类型的值无法转换为 JSONArray 检查你在 json 中的内容,问题必须在 json 中 ["iD":1,"name":"name1","iD":2,"name":"name2","iD":3,"name ":"name3","iD":4,"name":"name4"] 有什么问题吗? 添加获取json的部分【参考方案3】:

首先尝试将您的String json 转换为JSONObject,然后将JSONObject 转换为JSONArray。看到这个answer。

【讨论】:

我无法理解该页面上的 getNames 功能。我认为它不包含在 JSON 库中 你使用的json库叫什么名字? 导入 org.json.JSONArray;导入 org.json.JSONException;导入 org.json.JSONObject;

以上是关于如何解析 JSON 数组对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何解析包含多个相同类型的 JSON 对象(不是数组)的 JSON 对象

如何解析 JSON 数组对象?

如何解析 JSON 数据对象内的数组内的数组?

如何使用 Newtonsoft.Json 将包含数组数组的 json 对象解析为 C# 中的对象列表?

QT如何解析数组json中的对象

如何从通过 Moya.Response 查询返回的对象解析嵌套的 JSON 数组