Как я могу проанализировать строку JSON, в которой массив не разделен запятой? (Gson, Android Studio)

#java #android #json

#java #Android #json

Вопрос:

Это формат JSON (ответ от API — https://developer.ticketmaster.com/api-explorer/v2 /). Если я добавлю «_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"
                     }
                  }
               ]
            }
         }
      ]
   }
}
  

Комментарии:

1. Если это действительно есть "0": в начале содержимого массива ( [...] ), это недопустимый JSON. Итак, это нужно исправить.

2. Я попытался вызвать API, и он вообще не "0": возвращает там. Что он возвращает, "_embedded": { "venues": [{"name": "Reynolds Hall",... вы уверены, что это действительно строка JSON из вашего ответа?

3. Использовать Map<String, Venue>

4. Я думаю, вы правы, но если я добавлю _embedded атрибут recycler view, ничего не отобразится

5. Я считаю, что элементы в массиве [] должны быть разделены запятой.

Ответ №1:

Если это ваш 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();
}
  

Ответ №2:

Вы не можете, поскольку это недопустимый json, попробуйте любой валидатор, например: https://jsonformatter.curiousconcept.com /#

Итак, по сути, это не json. Это похоже только на json. Ссылка: https://www.rfc-editor.org/rfc/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<Целое число, место проведения>, где ключи будут равны 0,1 и так далее.