Как правильно обрабатывать несколько объектов JSON с помощью Retrofit 2? - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь проанализировать URL JSON с Retrofit 2 для моего проекта Android, и у меня есть вопрос.В моем URL JSON выглядит так:

{  
"channel0":{  
  "song":"Crush",
  "artist":"Jennifer Paige",
  "duration":"180",
  "playedat":"1545065265",
  "image_extralarge":"https:\/\/lastfm-img2.akamaized.net\/i\/u\/300x300\/8eecc92227fcbb09b43472f000df74e1.png"
},
"channel1":{  
  "song":"Reasons Why",
  "artist":"Brand New Immortals",
  "duration":"180",
  "playedat":"1545065371",
  "image_extralarge":"https:\/\/lastfm-img2.akamaized.net\/i\/u\/300x300\/c059afda95dd35354af26cf72e5deab4.png"
},
"channel2":{  
  "song":"Dance Me To The End Of Love",
  "artist":"Leonard Cohen",
  "duration":"300",
  "playedat":"1545065181",
  "image_extralarge":"https:\/\/lastfm-img2.akamaized.net\/i\/u\/300x300\/a368617dc7dc4716a9badb523ff6e7d4.png"
},
"channel3":{  
  "song":"4 Minutes",
  "artist":"Madonna",
  "duration":"180",
  "playedat":"1545065300",
  "image_extralarge":"https:\/\/lastfm-img2.akamaized.net\/i\/u\/300x300\/1dcefc6496be4155a00f919dcbb54f77.png"
},
"channel4":{  
  "song":"Mothers, Sisters, Daughters",
  "artist":"Voxtrot",
  "duration":"180",
  "playedat":"1545065257",
  "image_extralarge":"https:\/\/lastfm-img2.akamaized.net\/i\/u\/300x300\/5861b97231bd4ffe9218dfcacc27d68a.png"
}
}

И когда я использую POJO, он создает несколько классов для каждого канала.Итак, как правильно обрабатывать этот URL JSON?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Во-первых: это не называется JSON URL ... это просто JSON или JSON-данные, если хотите ... URL и JSON - это две совершенно разные вещи

Во-вторых: неясно, что вы имеете в виду, когдаВы говорите:

И когда я использую POJO, он создает несколько классов для каждого канала.Так каков правильный способ обработки этого URL-адреса JSON?

Если вы генерируете классы Java из любого инструмента JSON в POJO, это нормальное поведение, поскольку ни у одного инструмента нет способа угадать, что channel2То же самое, что и channel3 в качестве экземпляров JSON, они могут быть двумя совершенно разными вещами, узнать это невозможно.

Правильный способ - сначала спроектировать классы Java, а затем отобразить JSON, а не наоборот..

0 голосов
/ 11 декабря 2018

Каждый объект JSON может также считаться Map строк для элементов JSON.В таких случаях, когда вы собираетесь получить объект с динамическими именами ключей, вам не нужно пытаться создать класс Java для его представления.Вместо этого вы можете использовать Map<String, Object>.

В этом случае вы знаете, что каждое значение будет песней, поэтому вы можете быть немного более конкретным, чем Object.

Начать снапример, определение класса Song для хранения внутренних элементов:

public class Song {

    public String song;
    public String artist;
    ...
}

А затем вы сделаете свой вызов и зациклите результат:

Call<Map<String, Song>> call = ...
call.enqueue(new Callback<Map<String, Song>>() {

    @Override
    public void onResponse(Response<Map<String, Song>> response) {
        Map<String, Song> body = response.body();
        for (Song song : body.values()) {
            // your code here
        }
    }

    @Override
    public void onFailure(Throwable t) {
        // TODO
    }
});

Вы даже можете повернуть егов список песен, если вам нужно по какой-то причине:

List<Song> songs = new ArrayList<>(body.values());
...