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

嵌套JSON结构中获取photo_reference遇JSONException问题咨询

解决JSON解析中获取photo_reference的No value for photos错误

别慌!刚上手JSON解析遇到这种错误太正常了,咱们一步步拆解问题、解决它~

错误原因分析

你遇到的org.json.JSONException: No value for photos,通常是这两种情况:

  1. 接口返回的JSON里根本没有photos这个键,或者它的层级你找错了(比如嵌套在某个数组/对象里,不是直接在根对象下)
  2. 你尝试把photos当成JSONObject来获取,但它实际是JSONArray,导致解析失败

先确认JSON结构

首先你得先搞清楚接口返回的JSON到底长啥样,比如正常包含photos的结构可能是这样的:

{
  "results": [
    {
      "name": "某地点",
      "photos": [
        {
          "photo_reference": "abc123xyz",
          "width": 800,
          "height": 600
        },
        {
          "photo_reference": "def456uvw",
          "width": 1024,
          "height": 768
        }
      ]
    }
  ]
}

建议你先把完整的JSON响应打印出来(比如用Log.d("FullJSON", response)),确认photos的位置——它大概率不是直接在根对象下,而是嵌套在某个数组(比如results)的子对象里。

正确的解析步骤&代码示例

用Java的org.json库的话,你可以按照这个层级一步步解析,同时加上存在性检查避免异常:

try {
    // 假设response是你从接口拿到的JSON字符串
    JSONObject rootJsonObject = new JSONObject(response);

    // 第一步:获取外层的结果数组(比如这里的"results",根据你的实际JSON调整键名)
    if (rootJsonObject.has("results")) {
        JSONArray resultsArray = rootJsonObject.getJSONArray("results");

        // 遍历结果数组里的每个对象
        for (int i = 0; i < resultsArray.length(); i++) {
            JSONObject resultItem = resultsArray.getJSONObject(i);

            // 第二步:检查当前对象是否包含"photos"数组
            if (resultItem.has("photos")) {
                JSONArray photosArray = resultItem.getJSONArray("photos");

                // 第三步:遍历photos数组,提取每个对象的photo_reference
                for (int j = 0; j < photosArray.length(); j++) {
                    JSONObject photoItem = photosArray.getJSONObject(j);

                    // 最后:检查并获取photo_reference字段
                    if (photoItem.has("photo_reference")) {
                        String photoReference = photoItem.getString("photo_reference");
                        // 拿到值啦,这里可以做你需要的业务逻辑
                        Log.d("PhotoRefSuccess", "获取到图片参考值:" + photoReference);
                    } else {
                        Log.w("JSONWarning", "当前图片对象没有photo_reference字段");
                    }
                }
            } else {
                Log.w("JSONWarning", "当前结果对象没有photos数组");
            }
        }
    } else {
        Log.w("JSONWarning", "根对象没有results数组");
    }
} catch (JSONException e) {
    e.printStackTrace();
    Log.e("JSONError", "解析出错:" + e.getMessage());
}

关键注意事项

  • 一定要做存在性检查:用has()方法先判断键是否存在,不要直接调用getJSONArray()或getString(),否则遇到缺失字段就会抛出异常
  • 核对JSON层级:很多新手出错都是因为层级找错了,比如把嵌套在数组里的photos当成根对象的字段来取
  • 处理空数组:就算photos存在,也可能是空数组,所以遍历前可以先判断photosArray.length() > 0

内容的提问来源于stack exchange,提问作者Bikram Nath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:42:52