【问题标题】:Parsing json object in java, object not found在java中解析json对象,找不到对象
【发布时间】:2015-12-04 14:37:45
【问题描述】:

我正在尝试解析以下(预期的)json 响应以返回一个 id 数组

{
   "establishments":[
      {
         "establishment":{
            "id":21,
            "name":"Quick Bites"
         }
      },
      {
         "establishment":{
            "id":16,
            "name":"Casual Dining"
         }
      },
      {
         "establishment":{
            "id":7,
            "name":"Bar"
         }
      },
      {
         "establishment":{
            "id":6,
            "name":"Pub"
         }
      },
      {
         "establishment":{
            "id":5,
            "name":"Lounge"
         }
      },
      {
         "establishment":{
            "id":31,
            "name":"Bakery"
         }
      },
      {
         "establishment":{
            "id":18,
            "name":"Fine Dining"
         }
      },
      {
         "establishment":{
            "id":275,
            "name":"Pizzeria"
         }
      },
      {
         "establishment":{
            "id":1,
            "name":"Caf\u00e9"
         }
      },
      {
         "establishment":{
            "id":24,
            "name":"Deli"
         }
      },
      {
         "establishment":{
            "id":285,
            "name":"Fast Casual"
         }
      },
      {
         "establishment":{
            "id":271,
            "name":"Sandwich Shop"
         }
      },
      {
         "establishment":{
            "id":282,
            "name":"Taqueria"
         }
      },
      {
         "establishment":{
            "id":283,
            "name":"Brewery"
         }
      },
      {
         "establishment":{
            "id":161,
            "name":"Microbrewery"
         }
      },
      {
         "establishment":{
            "id":23,
            "name":"Dessert Parlour"
         }
      },
      {
         "establishment":{
            "id":101,
            "name":"Diner"
         }
      },
      {
         "establishment":{
            "id":286,
            "name":"Coffee Shop"
         }
      },
      {
         "establishment":{
            "id":81,
            "name":"Food Truck"
         }
      },
      {
         "establishment":{
            "id":91,
            "name":"Bistro"
         }
      },
      {
         "establishment":{
            "id":272,
            "name":"Cocktail Bar"
         }
      },
      {
         "establishment":{
            "id":284,
            "name":"Juice Bar"
         }
      },
      {
         "establishment":{
            "id":281,
            "name":"Fast Food"
         }
      },
      {
         "establishment":{
            "id":8,
            "name":"Club"
         }
      },
      {
         "establishment":{
            "id":20,
            "name":"Food Court"
         }
      },
      {
         "establishment":{
            "id":278,
            "name":"Wine Bar"
         }
      }
   ]
}

我正在使用以下代码:

private static void parseEstablishments (JSONObject r) {

    System.out.println("in parseEstablishments");
    System.out.println(r.length()); 


    JSONArray array = r.getJSONArray("establishment");

    List<String> list = new ArrayList<String>();

    for (int i = 0; i < array.length(); i++) {
        list.add(array.getJSONObject(i).getString("id"));
    }


    System.out.println("done");

}

r.length 打印出 1 并且 r.toString 打印出 {"encoding":"UTF8"}。我也收到以下错误:未找到 JSONObject["establishment"]。

不太确定出了什么问题。任何人都可以帮忙吗?谢谢。

【问题讨论】:

  • 设施应该可以工作,然后进去
  • @guillaumegirod-vitouchkina 访问机构然后是机构的语法是什么?抱歉,这方面很新。
  • @guillaume 机构也不起作用...

标签: java json api parsing


【解决方案1】:

如果您没有进入establishments,则无法访问establishment。例如,我们有 A 类,它的字段为 B。在获得A 之前,您无法访问B。另一个例子:吃橙子是先吃里面的还是去掉皮?

您也可以考虑检查您的 JSON 是否符合您的预期。

【讨论】:

  • 如何检查我的 json?当它用 toString() 打印出来时,我得到了 UTF8 代码,尽管我认为这不正确。如果我将响应转换为字符串缓冲区 > toString() 并打印它是我期望的响应。我如何进入机构?抱歉,这方面很新。
  • 试试string == expectedString。
  • json 响应 > 字符串缓冲区与 json 响应本身不同...我不明白为什么会这样或者我应该怎么做。
【解决方案2】:

希望这段代码 sn-p 对你有所帮助..!!

private static void parseEstablishments (JSONObject r) throws JSONException {
        System.out.println("in parseEstablishments");
        System.out.println(r.length()); 

        JSONArray array = r.getJSONArray("establishments");
        List<String> list = new ArrayList<String>();

        for (int i = 0; i < array.length(); i++) {
             JSONObject establishmentObj=new JSONObject(array.get(i).toString());
            list.add(String.valueOf(new JSONObject(establishmentObj.get("establishment").toString()).get("id")));
        }
        System.out.println("List Of Ids:"+list);
        System.out.println("done");

    }

【讨论】:

  • 正如@mibac 所说,首先需要访问机构然后遍历所有机构并获取ID,在使用此代码之前考虑性能(循环中的对象创建和toString操作..!!)
【解决方案3】:

首先应该是

JSONArray array = r.getJSONArray("establishments");

JSON 数组键是 establishments 和 s

然后因为你的对象嵌套在另一个对象中:

 {
     "establishment":{
        "id":21,
        "name":"Quick Bites"
     }
  }

你的循环需要改变:

for (int i = 0; i < array.length(); i++) {
    JSONObject establishmentObj=array.getJSONObject(i)
                                     .getJSONObject("establishment");
    list.add(establishmentObj.getString("id"));
}

【讨论】:

  • 我的代码甚至没有进入循环,事件在将数组键更改为“机构”后仍然显示“[机构] 未找到。”
  • 那有什么不对,建议登录r.toString()
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 2021-03-19
  • 2020-05-08
  • 2011-06-28
  • 2015-01-15
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多