Android 中 JSONObject 与 JSONArray 的问题
Problems with JSONObject vs JSONArray in Android
我想我有一个非常具体的问题。我正在使用 Volley 库从 URL 获取字符串响应,响应如下:
{"email":"imribar@gmail.com","phone":"7(707)111-11-11","family_name":"Жилин","name":"Иван","role":0}
我通过将我的 SQL 查询数组转换为 PHP
中的 JSON 来获得此响应
$output=$db->query("SELECT email, phone, family_name, name, role FROM users WHERE email=?", "$email")->fetchArray();
$json=json_encode($output, JSON_UNESCAPED_UNICODE);
echo"$json";
接下来我需要做的是完成这个 JSON 并将记录插入到我的 Android APP 中的本地数据库。为此,我执行以下操作:
if(response.contains("email")) {
testResponse.setText("Response is2: " + response);
try {
JSONArray jsonArr = new JSONArray(response);
for(int i=0; i < jsonArr.length();i++){
JSONObject jsonObj = jsonArr.getJSONObject(i);
Log.i("User",jsonObj.toString());
User user = new User();
user.email= jsonObj.getString("email");
user.phone=jsonObj.getString("phone");
user.firstName=jsonObj.getString("name");
user.lastName=jsonObj.getString("family_name");
user.role=jsonObj.getInt("role");
user.token="123123123fsadf";
insertUser inewuser = new insertUser();
inewuser.execute(user);
}
} catch (JSONException e) {
Log.i("JSONerror", e.toString());
}
}
我不断收到以下错误:
13:24:59.518 22389-22389/com.local.school I/JSONerror: org.json.JSONException: Value {"email":"imribar@gmail.com","phone":"7(707)111-11-11","family_name":"Жилин","name":"Иван","role":0} of type org.json.JSONObject cannot be converted to JSONArray
知道我可以在 PHP 端做什么来更改 JSON 字符串(添加 [],或向数组添加名称),或者我需要在 Android?
你的 json 字符串有一个 json 对象作为根对象,而在代码中你使用 JSONArray jsonArr = new JSONArray(response);
来解析它,就好像它是一个数组一样。假设你使用了 json 库,你将不得不开始解析 json 使用:
JSONObject jsonObj = new JSONObject(response);
另一种方法是实际生成一个 json 数组 ([...]
) 而不是 json 对象 ({...}
),以便您的解析代码能够识别它.您要做出的选择取决于您是始终发送单个 json 对象还是希望能够发送多个 json 对象(在 json 数组中)。
我建议您在应用中调用 Volley
时使用 JsonObjectRequest
而不是 StringRequest
。它与 StringRequest 几乎相同,但它得到一个 JSONObject
作为答案。
String url = "http://my-json-feed";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// your cose goes here:
JSONObject jsonObject = new JSONObject(response.toString());
User user = new User();
user.email= jsonObject.getString("email");
user.phone=jsonObject.getString("phone");
user.firstName=jsonObject.getString("name");
user.lastName=jsonObject.getString("family_name");
user.role=jsonObject.getInt("role");
user.token="123123123fsadf";
insertUser inewuser = new insertUser();
inewuser.execute(user);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO: Handle error
}
});
您的回复没有 json 数组,只有一个对象。
数组是这样的。
[{
"email": "imribar1@gmail.com",
"phone": "7(707)990-77-72",
"family_name": "Жилин2",
"name": "Иван2",
"role": 2
},
{
"email": "imribar@gmail.com",
"phone": "7(707)990-77-71",
"family_name": "Жилин",
"name": "Иван",
"role": 0
}
]
所以删除循环并尝试。
if(response.contains("email")) {
testResponse.setText("Response is2: " + response);
try {
JSONObject jsonObj = jsonArr.getJSONObject(i);
Log.i("User",jsonObj.toString());
User user = new User();
user.email= jsonObj.getString("email");
user.phone=jsonObj.getString("phone");
user.firstName=jsonObj.getString("name");
user.lastName=jsonObj.getString("family_name");
user.role=jsonObj.getInt("role");
user.token="123123123fsadf";
insertUser inewuser = new insertUser();
inewuser.execute(user);
} catch (JSONException e) {
Log.i("JSONerror", e.toString());
}
}
我想我有一个非常具体的问题。我正在使用 Volley 库从 URL 获取字符串响应,响应如下:
{"email":"imribar@gmail.com","phone":"7(707)111-11-11","family_name":"Жилин","name":"Иван","role":0}
我通过将我的 SQL 查询数组转换为 PHP
中的 JSON 来获得此响应 $output=$db->query("SELECT email, phone, family_name, name, role FROM users WHERE email=?", "$email")->fetchArray();
$json=json_encode($output, JSON_UNESCAPED_UNICODE);
echo"$json";
接下来我需要做的是完成这个 JSON 并将记录插入到我的 Android APP 中的本地数据库。为此,我执行以下操作:
if(response.contains("email")) {
testResponse.setText("Response is2: " + response);
try {
JSONArray jsonArr = new JSONArray(response);
for(int i=0; i < jsonArr.length();i++){
JSONObject jsonObj = jsonArr.getJSONObject(i);
Log.i("User",jsonObj.toString());
User user = new User();
user.email= jsonObj.getString("email");
user.phone=jsonObj.getString("phone");
user.firstName=jsonObj.getString("name");
user.lastName=jsonObj.getString("family_name");
user.role=jsonObj.getInt("role");
user.token="123123123fsadf";
insertUser inewuser = new insertUser();
inewuser.execute(user);
}
} catch (JSONException e) {
Log.i("JSONerror", e.toString());
}
}
我不断收到以下错误:
13:24:59.518 22389-22389/com.local.school I/JSONerror: org.json.JSONException: Value {"email":"imribar@gmail.com","phone":"7(707)111-11-11","family_name":"Жилин","name":"Иван","role":0} of type org.json.JSONObject cannot be converted to JSONArray
知道我可以在 PHP 端做什么来更改 JSON 字符串(添加 [],或向数组添加名称),或者我需要在 Android?
你的 json 字符串有一个 json 对象作为根对象,而在代码中你使用 JSONArray jsonArr = new JSONArray(response);
来解析它,就好像它是一个数组一样。假设你使用了 json 库,你将不得不开始解析 json 使用:
JSONObject jsonObj = new JSONObject(response);
另一种方法是实际生成一个 json 数组 ([...]
) 而不是 json 对象 ({...}
),以便您的解析代码能够识别它.您要做出的选择取决于您是始终发送单个 json 对象还是希望能够发送多个 json 对象(在 json 数组中)。
我建议您在应用中调用 Volley
时使用 JsonObjectRequest
而不是 StringRequest
。它与 StringRequest 几乎相同,但它得到一个 JSONObject
作为答案。
String url = "http://my-json-feed";
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// your cose goes here:
JSONObject jsonObject = new JSONObject(response.toString());
User user = new User();
user.email= jsonObject.getString("email");
user.phone=jsonObject.getString("phone");
user.firstName=jsonObject.getString("name");
user.lastName=jsonObject.getString("family_name");
user.role=jsonObject.getInt("role");
user.token="123123123fsadf";
insertUser inewuser = new insertUser();
inewuser.execute(user);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO: Handle error
}
});
您的回复没有 json 数组,只有一个对象。 数组是这样的。
[{
"email": "imribar1@gmail.com",
"phone": "7(707)990-77-72",
"family_name": "Жилин2",
"name": "Иван2",
"role": 2
},
{
"email": "imribar@gmail.com",
"phone": "7(707)990-77-71",
"family_name": "Жилин",
"name": "Иван",
"role": 0
}
]
所以删除循环并尝试。
if(response.contains("email")) {
testResponse.setText("Response is2: " + response);
try {
JSONObject jsonObj = jsonArr.getJSONObject(i);
Log.i("User",jsonObj.toString());
User user = new User();
user.email= jsonObj.getString("email");
user.phone=jsonObj.getString("phone");
user.firstName=jsonObj.getString("name");
user.lastName=jsonObj.getString("family_name");
user.role=jsonObj.getInt("role");
user.token="123123123fsadf";
insertUser inewuser = new insertUser();
inewuser.execute(user);
} catch (JSONException e) {
Log.i("JSONerror", e.toString());
}
}