从 JSON 响应中获取数组列表
Get an arraylist from JSON response
我有一个节点 js API 并且我正在使用 Volley 将 JSON 响应从它获取到 android , API returns 结果一个 select 查询,我需要在 android 部分的对象数组列表 'News' 中得到这个结果。
这是节点 js API 部分:
connection.query("SELECT * FROM news",
function(err,rows,fields){
if (!err){
if (rows.length > 0){
res.setHeader('Content-Type', 'application/json');
res.send(rows);
}
else{
var error = {msg: "news is empty"}
res.send(error);
}
}
});
这是 android 部分,我需要从数组列表中的 json 响应中获取 'rows' :
String URLnews = "http://10.0.2.2:3000/getnews";
RequestQueue requestQueueNews = Volley.newRequestQueue(this);
JsonObjectRequest objectRequestNews = new JsonObjectRequest(
Request.Method.GET,
URLnews,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject responsenews) {
Log.e("news length",responsenews.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Rest Response",error.toString());
}
}
);
requestQueueNews.add(objectRequestNews);
这是 JSON 响应:
[
{"idnews":1,"content":"news first news","image":"img"},
{"idnews":2,"content":"news 2","image":"img2"}
]
请注意 API 工作正常,它返回结果,但作为 android 中打印的字符串,但我需要在数组列表中的单独对象中获取每一行是可能的?
这里您缺少的是 JSON 的转换。例如,您可以使用 GSON 来完成工作。
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray responsenews) {
Log.e("news length",responsenews.toString());
Gson gson = new Gson();
Type type = new TypeToken<List<News>>() {}.getType();
List<News> news = gson.fromJson(responsestr, listType);
}
},
您需要定义新闻 class,仅此而已。
注意:答案已更新以反映 正确注意到的事实,即应该是 JSON 数组请求
因为您的 JSON 对象在 JSON 数组中,所以您需要将 JsonObjectRequest 更改为 JsonArrayRequest。
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray responsenews) {
try {
for (int i = 0; i < responsenews.length(); i++) {
JSONObject object = responsenews.getJSONObject(i);
int id = object.getInt("idnews");
String content = object.getString("content");
String image = object.getString("image");
}
}catch (JSONException e) {
e.printStackTrace();
}
}
}
我有一个节点 js API 并且我正在使用 Volley 将 JSON 响应从它获取到 android , API returns 结果一个 select 查询,我需要在 android 部分的对象数组列表 'News' 中得到这个结果。 这是节点 js API 部分:
connection.query("SELECT * FROM news",
function(err,rows,fields){
if (!err){
if (rows.length > 0){
res.setHeader('Content-Type', 'application/json');
res.send(rows);
}
else{
var error = {msg: "news is empty"}
res.send(error);
}
}
});
这是 android 部分,我需要从数组列表中的 json 响应中获取 'rows' :
String URLnews = "http://10.0.2.2:3000/getnews";
RequestQueue requestQueueNews = Volley.newRequestQueue(this);
JsonObjectRequest objectRequestNews = new JsonObjectRequest(
Request.Method.GET,
URLnews,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject responsenews) {
Log.e("news length",responsenews.toString());
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("Rest Response",error.toString());
}
}
);
requestQueueNews.add(objectRequestNews);
这是 JSON 响应:
[
{"idnews":1,"content":"news first news","image":"img"},
{"idnews":2,"content":"news 2","image":"img2"}
]
请注意 API 工作正常,它返回结果,但作为 android 中打印的字符串,但我需要在数组列表中的单独对象中获取每一行是可能的?
这里您缺少的是 JSON 的转换。例如,您可以使用 GSON 来完成工作。
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray responsenews) {
Log.e("news length",responsenews.toString());
Gson gson = new Gson();
Type type = new TypeToken<List<News>>() {}.getType();
List<News> news = gson.fromJson(responsestr, listType);
}
},
您需要定义新闻 class,仅此而已。
注意:答案已更新以反映
因为您的 JSON 对象在 JSON 数组中,所以您需要将 JsonObjectRequest 更改为 JsonArrayRequest。
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray responsenews) {
try {
for (int i = 0; i < responsenews.length(); i++) {
JSONObject object = responsenews.getJSONObject(i);
int id = object.getInt("idnews");
String content = object.getString("content");
String image = object.getString("image");
}
}catch (JSONException e) {
e.printStackTrace();
}
}
}