Android应用提取服务器JSON时无法创建JSONObject问题求助
解决Android中JSON解析“无法正确创建JSONObject”的问题
我来帮你排查这个问题!从你给出的JSON结构来看,核心问题出在results字段的取值类型上——它不是直接的JSON数组,而是字符串形式的JSON数组,这就是你解析时出错的原因。
问题分析
你拿到的完整JSON结构是这样的:
{"results":"[{\"url\":\"https:\\\/\\\/augmentedandroidapp.000webhostapp.com\\\\/images\\\\/kamara1.jpg\"},{\"url\":\"https:\\\/\\\/augmentedandroidapp.000webhostapp.com\\\\/images\\\\/kamara2.jpg\"},{\"url\":\"https:\\\/\\\/augmentedandroidapp.000webhostapp.com\\\\/images\\\\/kamara3.jpg\"}]"}
注意看results的值被双引号包裹着,本质是一个字符串,而非原生的JSON数组。如果直接把它当作JSONArray或JSONObject来解析,自然会抛出异常。
解决方案(原生org.json库)
我们需要分两步解析:先取出外层的字符串,再把这个字符串解析成JSON数组。以下是具体代码示例:
// 假设你已经获取到完整的JSON响应字符串,命名为jsonResponse try { // 1. 解析外层的JSONObject JSONObject outerJsonObject = new JSONObject(jsonResponse); // 2. 取出results对应的字符串值(注意这里是getString,不是getJSONArray) String resultsString = outerJsonObject.getString("results"); // 3. 将字符串形式的数组解析为JSONArray JSONArray imageUrlArray = new JSONArray(resultsString); // 4. 遍历数组,逐个获取图片URL for (int i = 0; i < imageUrlArray.length(); i++) { JSONObject imageItem = imageUrlArray.getJSONObject(i); String imageUrl = imageItem.getString("url"); // 这里可以添加你的图片加载逻辑,比如用Glide/Picasso加载图片 Log.d("ImageLoader", "获取到图片URL: " + imageUrl); } } catch (JSONException e) { e.printStackTrace(); // 处理解析错误,比如给用户提示“图片列表加载失败” }
备选方案(使用Gson库)
如果你项目中使用Gson进行JSON解析,也可以通过实体类配合TypeToken来处理:
首先定义对应的实体类:
// 外层响应实体 public class ImageListResponse { @SerializedName("results") private String resultsJsonString; public String getResultsJsonString() { return resultsJsonString; } } // 单张图片的实体 public class ImageItem { @SerializedName("url") private String imageUrl; public String getImageUrl() { return imageUrl; } }
然后进行解析:
Gson gson = new Gson(); // 解析外层响应 ImageListResponse response = gson.fromJson(jsonResponse, ImageListResponse.class); // 将字符串形式的数组解析为图片列表 List<ImageItem> imageItemList = gson.fromJson( response.getResultsJsonString(), new TypeToken<List<ImageItem>>() {}.getType() ); // 遍历获取URL for (ImageItem item : imageItemList) { Log.d("ImageLoader", "获取到图片URL: " + item.getImageUrl()); }
额外建议
如果可以修改服务器端的返回格式,建议直接将results设为原生JSON数组(去掉外层的双引号),这样解析会更简洁规范,比如:
{"results":[{"url":"https:\/\/augmentedandroidapp.000webhostapp.com\/images\/kamara1.jpg"},{"url":"https:\/\/augmentedandroidapp.000webhostapp.com\/images\/kamara2.jpg"},{"url":"https:\/\/augmentedandroidapp.000webhostapp.com\/images\/kamara3.jpg"}]}
内容的提问来源于stack exchange,提问作者user2966853
相关产品推荐
相关产品推荐

