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

Android/Sketchware中Gson解析JSON报错:BEGIN_ARRAY but was STRING 求助

解决JSON解析错误及正确适配RecyclerView的方案

错误原因分析

BEGIN_ARRAY but was STRING at line 1 column 1 错误核心诱因有两个:

  • 接口返回的不是预期JSON结构,可能是错误文本(比如服务器报错的HTML、纯字符串提示)
  • 当前代码直接把整个响应当成List<Map<String,Object>>解析,但实际响应是包含user数组的对象,而非数组本身

修正后的代码实现

方案1:用Map解析整个响应对象(无需实体类,快速适配)

try {
    // 先解析完整的JSON响应对象
    Map<String, Object> responseMap = new Gson().fromJson(_response, new TypeToken<Map<String, Object>>(){}.getType());
    
    // 提取user数组并转为目标集合类型
    List<Map<String, Object>> card_list = (List<Map<String, Object>>) responseMap.get("user");
    
    // 校验数据并适配RecyclerView
    if (card_list != null && card_list.size() > 5) {
        recyclerview1.setAdapter(new Recyclerview1Adapter(card_list));
    } else {
        String tip = card_list == null ? "数据格式错误" : "数据量不足";
        SketchwareUtil.showMessage(getApplicationContext(), tip + "\n原响应:" + _response);
    }
} catch (JsonSyntaxException e) {
    // 捕获非JSON格式响应,避免崩溃
    SketchwareUtil.showMessage(getApplicationContext(), "响应格式错误:" + e.getMessage());
    e.printStackTrace();
}

方案2:用实体类解析(更规范,长期维护推荐)

如果需要长期维护,建议用实体类解析,避免类型转换风险:

// 1. 定义响应实体类(Sketchware中可通过添加自定义类实现)
class UserResponse {
    private List<User> user;
    private String next;
    
    // 内部用户数据实体类
    static class User {
        private String id;
        private String address;
        private String contact;
        private String name;
        private String description;
        private String image_url;
        
        // 自动生成Getter方法
        public String getId() { return id; }
        public String getAddress() { return address; }
        public String getContact() { return contact; }
        public String getName() { return name; }
        public String getDescription() { return description; }
        public String getImage_url() { return image_url; }
    }
    
    public List<User> getUser() { return user; }
    public String getNext() { return next; }
}

// 2. OnResponse中的解析逻辑
try {
    UserResponse response = new Gson().fromJson(_response, UserResponse.class);
    List<UserResponse.User> userList = response.getUser();
    
    if (userList != null && userList.size() > 5) {
        // 转成Adapter需要的List<Map>格式
        List<Map<String, Object>> card_list = new ArrayList<>();
        for (UserResponse.User user : userList) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", user.getId());
            map.put("address", user.getAddress());
            map.put("contact", user.getContact());
            map.put("name", user.getName());
            map.put("description", user.getDescription());
            map.put("image_url", user.getImage_url());
            card_list.add(map);
        }
        recyclerview1.setAdapter(new Recyclerview1Adapter(card_list));
    } else {
        String tip = userList == null ? "数据格式错误" : "数据量不足";
        SketchwareUtil.showMessage(getApplicationContext(), tip + "\n原响应:" + _response);
    }
} catch (JsonSyntaxException e) {
    SketchwareUtil.showMessage(getApplicationContext(), "响应格式错误:" + e.getMessage());
    e.printStackTrace();
}

关键优化点

  • 增加try-catch捕获JsonSyntaxException,避免非JSON响应导致崩溃
  • 先解析完整响应对象,再提取内部user数组,匹配接口实际返回结构
  • 增加null判断,防止user字段不存在引发空指针异常

内容的提问来源于stack exchange,提问作者inshanity ina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:52:22