You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中用Volley从API取数填充Spinner时出现解析错误

解决Volley获取API数据填充Spinner的解析错误问题

核心问题诊断

你遇到的问题根源有两个:

  1. JSON字段不匹配:API返回的字段是ROLEID、ROLENAME等,但你的解析代码错误地使用了BRANCHID、BRANCHNAME,导致硬编码时(你当时用对了字段)能正常运行,但网络请求解析时失败。
  2. 转义字符未处理:网络响应可能包含额外的转义反斜杠或外层引号,直接解析会触发JSON格式错误。

修复步骤与代码示例

1. 定义Role实体类(可选但推荐)

用于封装角色数据,方便Spinner显示:

public class Role {
    private int roleId;
    private String roleCode;
    private String roleName;
    private int isActive;

    public Role(int roleId, String roleCode, String roleName, int isActive) {
        this.roleId = roleId;
        this.roleCode = roleCode;
        this.roleName = roleName;
        this.isActive = isActive;
    }

    // Getter方法
    public int getRoleId() { return roleId; }
    public String getRoleCode() { return roleCode; }
    public String getRoleName() { return roleName; }
    public int getIsActive() { return isActive; }

    // Spinner显示时会调用此方法,返回要展示的文本
    @Override
    public String toString() {
        return roleName;
    }
}

2. 修正Volley请求的解析逻辑

重点处理转义字符和字段匹配:

// 初始化Volley请求队列
RequestQueue queue = Volley.newRequestQueue(this);
String apiUrl = "你的API接口地址";

StringRequest roleRequest = new StringRequest(Request.Method.GET, apiUrl,
        response -> {
            // 第一步:清理响应中的转义字符和外层引号
            String cleanedJson = response.trim();
            if (cleanedJson.startsWith("\"") && cleanedJson.endsWith("\"")) {
                // 去掉外层包裹的引号
                cleanedJson = cleanedJson.substring(1, cleanedJson.length() - 1);
                // 替换转义反斜杠
                cleanedJson = cleanedJson.replace("\\", "");
            }

            try {
                // 第二步:解析为JSON数组,注意字段名与API完全一致
                JSONArray roleArray = new JSONArray(cleanedJson);
                List<Role> roleList = new ArrayList<>();

                for (int i = 0; i < roleArray.length(); i++) {
                    JSONObject roleObj = roleArray.getJSONObject(i);
                    int roleId = roleObj.getInt("ROLEID");
                    String roleCode = roleObj.getString("ROLECODE");
                    String roleName = roleObj.getString("ROLENAME");
                    int isActive = roleObj.getInt("ISACTIVE");

                    roleList.add(new Role(roleId, roleCode, roleName, isActive));
                }

                // 第三步:填充Spinner
                ArrayAdapter<Role> adapter = new ArrayAdapter<>(this,
                        android.R.layout.simple_spinner_item, roleList);
                adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                // 假设你的Spinner实例名为roleSpinner
                roleSpinner.setAdapter(adapter);

            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(this, "解析失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        },
        error -> Toast.makeText(this, "网络请求失败:" + error.getMessage(), Toast.LENGTH_SHORT).show()
);

// 将请求加入队列
queue.add(roleRequest);

额外注意事项

  • 确保AndroidManifest.xml中添加了网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 调试时可以用Log.d("API_RESPONSE", cleanedJson)打印处理后的JSON,确认格式是否正确
  • 如果API返回的是标准JSON数组(无额外转义),可以跳过转义字符处理步骤

内容的提问来源于stack exchange,提问作者priya koli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:43:16