如何解析 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 对象