#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 и так далее.