Node.js接口返回无数组名JSON,如何添加数组名适配Android Spinner?
修改Node.js接口返回带数组名的JSON结构适配Android Spinner
问题背景
你现在用Node.js写接口从MSSQL的ItemSetting_tbl表查询item数据,当前接口返回的是无外层键名的JSON数组,虽然已经通过Android端Volley的JsonArrayRequest完成了适配,但希望修改Node.js代码,让接口返回带Spinner数组名的JSON结构(比如{"Spinner": [{"item": "WATER"}, ...]})。
当前Node.js接口输出
Node.js接口返回的用于Android Spinner展示的查询结果
[ { "item": "WATER" }, { "item": "DFG" }, { "item": "2InchPipe" }, { "item": "5InchPipe" } ]
当前Node.js核心代码
从MSSQL获取数据的Node.js代码
// GET ITEM DROP DOWN INFO app.get("/api/user/spinner", function(req , res){ var query = "select item from ItemSetting_tbl "; executeQuery (res, sendname); });
修改方案
核心思路是把查询得到的数组包裹在一个包含Spinner键的对象中再返回。需要调整处理查询结果的回调逻辑(也就是你的sendname函数,这个函数应该是executeQuery用来返回数据的回调):
假设你的sendname函数原本是直接返回查询结果数组:
// 原sendname函数(示例) function sendname(res, queryResult) { res.json(queryResult); // 直接返回数组 }
修改成:
// 修改后的sendname函数 function sendname(res, queryResult) { // 将数组包裹到带Spinner键的对象里 res.json({ Spinner: queryResult }); }
如果你的executeQuery是直接在接口里处理结果,也可以直接在路由回调里调整:
app.get("/api/user/spinner", function(req , res){ var query = "select item from ItemSetting_tbl "; // 假设executeQuery的回调是直接拿到结果 executeQuery(query, function(err, result) { if (err) { res.status(500).json({ error: err.message }); return; } // 包裹成目标结构返回 res.json({ Spinner: result }); }); });
修改后预期输出
期望返回带数组名的JSON结构
{ "Spinner": [ { "item": "WATER" }, { "item": "DFG" }, { "item": "2InchPipe" }, { "item": "5InchPipe" } ] }
(可选)Android端对应调整
如果后续要适配新的接口结构,需要把JsonArrayRequest改成JsonObjectRequest,解析时先拿到Spinner对应的数组:
JsonObjectRequest request = new JsonObjectRequest(URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { JSONArray spinnerArray = response.getJSONArray("Spinner"); // 后续解析逻辑和之前一致 for (int i = 0; i < spinnerArray.length(); i++) { JSONObject obj = spinnerArray.getJSONObject(i); String item = obj.getString("item"); CountryName.add(item); } spinner.setAdapter(new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_dropdown_item, CountryName)); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 错误处理 } }); MySingleton.getmInstance(MainActivity.this).addToRequestQue(request);
内容的提问来源于stack exchange,提问作者Shabek Mahmood
相关产品推荐
相关产品推荐

