java—如何解析数组中没有逗号分隔的json字符串(gson,android工作室)

qv7cva1a  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(456)

这是json格式(来自api的响应-https://developer.ticketmaster.com/api-explorer/v2/). 如果我添加“\u embedded”(有一个场馆列表)作为event类的属性,则不起作用。
如何从这个json获取位置?

{ "_embedded":{
      "events":[
         {
            "name":"Hamilton",
            "type":"event",
            "id":"Z7r9jZ1Ae0EP8",
            "test":false,
            "url":"http://www.ticketsnow.com/InventoryBrowse/TicketList.aspx?PID=2927950",
            "_embedded":{
               "venues":[
                  "0":                  {
                     "name":"Reynolds Hall",
                     "type":"venue",
                     "id":"Z7r9jZadyb",
                     "test":false,
                     "locale":"en-us",
                     "location":{
                        "longitude":"-115.162598",
                        "latitude":"36.182201"
                     }
                  }
               ]
            }
         }
      ]
   }
}
yqyhoc1h

yqyhoc1h1#

如果这是您的json:

{
  "_embedded": {
    "events": [
      {
        "name": "Hamilton",
        "type": "event",
        "id": "Z7r9jZ1Ae0EP8",
        "test": false,
        "url": "http://www.ticketsnow.com/InventoryBrowse/TicketList.aspx?PID=2927950",
        "_embedded": {
          "venues": [
            {
              "name": "Reynolds Hall",
              "type": "venue",
              "id": "Z7r9jZadyb",
              "test": false,
              "locale": "en-us",
              "location": {
                "longitude": "-115.162598",
                "latitude": "36.182201"
              }
            }
          ]
        }
      }
    ]
  }
}

然后您可以像这样检索位置(假设您将其存储在jstring变量中):

try {
    JSONObject jObj = new JSONObject(jString);
    String lat = jObj
            .getJSONObject("_embedded")
            .getJSONObject("events")
            .getJSONObject("_embedded")
            .getJSONArray("venues")
            .getJSONObject(0)
            .getJSONObject("location")
            .getString("latitude");
    String lng = jObj
            .getJSONObject("_embedded")
            .getJSONObject("events")
            .getJSONObject("_embedded")
            .getJSONArray("venues")
            .getJSONObject(0)
            .getJSONObject("location")
            .getString("longitude");
    LatLng location = new LatLng(Double.parseDouble(lat), Double.parseDouble(lng));
} catch (JSONException | NumberFormatException e) {
    e.printStackTrace();
}
mrfwxfqh

mrfwxfqh2#

因为这不是有效的json,所以不能尝试任何验证程序,例如:https://jsonformatter.curiousconcept.com/#
所以基本上,它不是json。它只类似于json。参考文献:https://tools.ietf.org/html/rfc8259
您可以在处理之前尝试更正它。在这种情况下,请更换 [{ ,所以应该是这样的:

{ "_embedded":{
      "events":[
         {
            "name":"Hamilton",
            "type":"event",
            "id":"Z7r9jZ1Ae0EP8",
            "test":false,
            "url":"http://www.ticketsnow.com/InventoryBrowse/TicketList.aspx?PID=2927950",
            "_embedded":{
               "venues":{
                  "0":                  {
                     "name":"Reynolds Hall",
                     "type":"venue",
                     "id":"Z7r9jZadyb",
                     "test":false,
                     "locale":"en-us",
                     "location":{
                        "longitude":"-115.162598",
                        "latitude":"36.182201"
                     }
                  }
               }
            }
         }
      ]
   }
}

更多 venues 项目应为:

{
   "_embedded":{
      "events":[
         {
            "name":"Hamilton",
            "type":"event",
            "id":"Z7r9jZ1Ae0EP8",
            "test":false,
            "url":"http://www.ticketsnow.com/InventoryBrowse/TicketList.aspx?PID=2927950",
            "_embedded":{
               "venues":{
                  "0":{
                     "name":"Reynolds Hall",
                     "type":"venue",
                     "id":"Z7r9jZadyb",
                     "test":false,
                     "locale":"en-us",
                     "location":{
                        "longitude":"-115.162598",
                        "latitude":"36.182201"
                     }
                  },

                  "1":{
                     "name":"Reynolds Hall",
                     "type":"venue",
                     "id":"Z7r9jZadyb",
                     "test":false,
                     "locale":"en-us",
                     "location":{
                        "longitude":"-115.162598",
                        "latitude":"36.182201"
                     }
                  }

               }
            }
         }
      ]
   }
}

无法反序列化 venues 作为map<integer,venture>,其中键为0,1,依此类推。

相关问题