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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:05:23