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
相关产品推荐
相关产品推荐

