JSON解析帮助(原生Android、java)

Posted

技术标签:

【中文标题】JSON解析帮助(原生Android、java)【英文标题】:JSON parsing help (Native 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 错误。只是说... 【参考方案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")。感谢您的帮助。

以上是关于JSON解析帮助(原生Android、java)的主要内容,如果未能解决你的问题,请参考以下文章

原生JSON解析

java中把json怎么转换成数组

java中把json怎么转换成数组?

一起Talk Android吧(第三百五十九回:Gson库解析 VS JAava原生解析)

json原生解析

Android 解析JSON