首页 > 解决方案 > 如何解析 JSON 数组对象?

问题描述

我正在尝试ListView在 Android 上获取 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);

标签: androidjsonlistview

解决方案


您应该使用诸如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 编写的。


推荐阅读