【问题标题】:JSON parsing help (Native Android, java)JSON解析帮助(原生Android、java)
【发布时间】:2021-11-01 02:35:46
【问题描述】:

我正在尝试进行 JSON 解析。 JSON数据如下所示,我正在尝试获取“类别”。我能够 JSON 解析其他所有内容,但我不确定这个“类别”属于什么,它是 JSONObject、JSONArray 还是其他什么?我是一个自学成才的新手,通常我熟悉JSONArray的形式为“JSONArray”:{[“content”]},“content”是JSONObject。但在这种情况下,“类别”:[“内容”]。我正在尝试解析这个“类别”,并将其转换为字符串。感谢您的帮助。

{
   "results": [
   {
      "type": "Restaurant",
      "id": "jfhuiewjkfkdljiahueijkfnlsdiejkl1484391hjk8421k",
      "score": 99.9844207764,
      "dist": 15.581982823437135,
      "info": "search:ta:840369014527642-US",
      "poi": {
         "name": "RoofTop Bar",
         "categorySet": [
         {
            "id": 184729472943
         }
      ],
      "categories": [
         "pub food",
         "restaurant"
      ]}
   }]
}

这是我尝试过的:

groups = new JSONArray(); 
groups = response.getJSONArray("results");
if (groups.length() > 0) {
   JSONObject resultObject = groups.getJSONObject(0);
   if (resultObject.has("poi")) {
      if (resultObject.getJSONObject("poi").has("name")) {
         nameResult = resultObject.getJSONObject("poi").getString("name");
      } else {
         nameResult = "Information is not available.";
      }
      if (resultObject.getJSONObject("poi").has("categories")) {
         JSONObject categoriesResult;
         categoriesResult = resultObject.getJSONObject("categories").toString();
      }

【问题讨论】:

  • 此 json 无效.. "poi" 对象未关闭。
  • 我刚刚编辑了,现在应该已经完成​​了。
  • 尝试类似jsonlint.com 以确保您的 JSON 有效。它仍然失败。 Notepad++ 还有一个不错的插件“JSON Viewer”,它有一个“Format JSON”可以验证它。
  • 嗨,JSON 应该是有效的,我能够获取其他信息的信息,例如名称。但我只是不熟悉“类别”的格式。
  • @Brian McCanaugh - 使用复杂的 if/else 块......当您未能正确 INDENT 时,您可能会无意中导致很多 LOGIC 错误。只是说...

标签: java android arrays json parsing


【解决方案1】:
  • results 是一个对象数组
  • 第一个对象包含一个名为poi 的属性
  • poi 包含一个名为 categories 的属性

所以使用从上到下的方法,我们可以到达

const categoriesArray = results[0].poi.categories; // gives categories as an array of strings

const categoriesString = categoriesArray.join(",") // gives categories as string, with comma separated values

【讨论】:

  • 您好,我会通过您的推荐获得类别 =“酒吧食品、餐厅”吗?我已经编辑了我的问题,包括我在 Android Studio 中尝试过的内容。
  • 嗨@BrianMcCanaugh。请找到我编辑的答案。在那里,categoriesString 就是你要找的东西
【解决方案2】:

我不确定它是否是实际的原始数据,但包含类别的 poi 对象格式不正确。它缺少一个可能导致解析问题的右括号。

除此之外,来自 poi 对象的字段类别是一个字符串列表

为了获得它们,您可以使用results[0].poi.categories 从您的对象中访问它们,或者在使用result.poi.categories 访问类别之前遍历结果,其中result 是包含当前循环结果的变量。

编辑:

从您的代码示例中,假设响应是 JSONObject,您可以执行以下操作。

然后要获取不使用数组格式的字符串中的类别,您可以遍历类别并将它们连接到一个字符串。

String categories = resultObject.get("categories").join(", ");

【讨论】:

  • 您好,我会通过您的推荐获得类别 =“酒吧食品、餐厅”吗?我已经编辑了我的问题,包括我在 Android Studio 中尝试过的内容。
  • 目前你会得到一个表示数组的字符串,它看起来像 "[\"pub food\", \"restaurant\"]" 如果你想要你提到的你必须循环遍历数组并使用类别上的 toString 将它们连接到一个字符串。
  • 嗨,我确实尝试过使用 toString 方法。但是我收到一条错误消息,说明“找不到类别”。我无法使用 getJSONObject 和 getJSONArray 获取“类别”的内容。
  • 我已根据您的需要更新了我的 anwser。您能否与 resultObject.getJSONArray("categories") 分享您遇到的完整异常消息?
  • 我想通了。我刚刚使用了 .get("categories")。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2011-02-27
  • 1970-01-01
  • 2016-07-14
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多