【问题标题】:How to parse a JSON Array Object?如何解析 JSON 数组对象?
【发布时间】: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 字符串没有问题
  • 你的错误是什么?请分享您的错误。
  • 我还在寻找

标签: android json listview


【解决方案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给出这个例子吗?
  • 这是一个 Java 示例stackoverflow.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;
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多