Android, Refrofit. Как разобрать JSON с неизвестным ключом?

147
27 августа 2021, 07:10

У меня такой вопрос, как разобрать json с неизвестным ключом? https://acx.io//api/v2/tickers.json - из этого json я хочу получить массив из двух полей base_unit и quote_unit.

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import java.util.List;
import java.util.Map;
public class CurrencyACX {
    private Map<String, PairsACX> listCurrencyACX;
    public Map<String, PairsACX> getListCurrencyACX() {
        return listCurrencyACX;
    }
    public class PairsACX{
        @SerializedName("base_unit")
        @Expose
        private String baseCurrency;
        @SerializedName("quote_unit")
        @Expose
        private String quoteCurrency;
        public String getBaseCurrency() {
            return baseCurrency;
        }
        public String getQuoteCurrency() {
            return quoteCurrency;
        }
    }
}
public interface JsonPlaceHolderAPI {
    //list from ACX
    @GET("/api/v2/tickers.json")
    Call<CurrencyACX> getCurrencyListACX();
}
  private void addListCurrencyACX(){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://acx.io/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        JsonPlaceHolderAPI requestInterface = retrofit.create(JsonPlaceHolderAPI.class);
        Call<CurrencyACX> call = requestInterface.getCurrencyListACX();
        call.enqueue(new Callback<CurrencyACX>() {
            @Override
            public void onResponse(Call<CurrencyACX> call, Response<CurrencyACX> response) {
                Log.d("myLOG","Succes");

//                Log.d("myLOG","======" + response.body().getListCurrencyACX().isEmpty());
             }
            @Override
            public void onFailure(Call<CurrencyACX> call, Throwable t) {
                Log.d("myLOG","Failed");
            }
        });

onResponse выполняется успешно, но когда я пытаюсь обрабатывать response, response у меня пустой. Я использую библиотеку retrofit. Нашел в интернете пару нерабочих в моем случай примеров https://www.freshbytelabs.com/2018/11/parse-json-array-with-unkown-key-using.html и https://stackoverflow.com/questions/33758601/parse-dynamic-key-json-string-using-retrofit. Может быть я не смог разобраться. Не понимаю в чем проблема. Заранее Благодарю!

Answer 1

Вы и не должны инициализировать Map - при правильно составленном POJO это должен сделать GsonConverter. В вашем случае Map должна быть корневым объектом response, класс CurrencyACX лишний, а PairsACX нужно вывести в отдельный java-файл.

public interface JsonPlaceHolderAPI {
    //list from ACX
    @GET("/api/v2/tickers.json")
    Call<Map<String, PairsACX>> getCurrencyListACX();
}
private void addListCurrencyACX(){
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://acx.io/")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
    JsonPlaceHolderAPI requestInterface = retrofit.create(JsonPlaceHolderAPI.class);
    Call<Map<String, PairsACX>> call = requestInterface.getCurrencyListACX();
    call.enqueue(new Callback<Map<String, PairsACX>>() {
        @Override
        public void onResponse(Call<Map<String, PairsACX>> call, Response<Map<String, PairsACX>> response) {
            Log.d("myLOG","Succes");
            Log.d("myLOG","======" + response.body().isEmpty());
        }
        @Override
        public void onFailure(Call<Map<String, PairsACX>> call, Throwable t) {
            Log.d("myLOG","Failed");
        }
    });
READ ALSO
Что делает, означает аннотация @Stable?

Что делает, означает аннотация @Stable?

вот к примеру в классе String есть такое вот выражение

188
Азбука Морзе + Шифр Цезаря [дубликат]

Азбука Морзе + Шифр Цезаря [дубликат]

Всем добрый день! В общем не знаю, сможет ли кто помочь, так как вопрос сложный и объёмный, но все же отпишусьПошел я на курсы по java, знания базовой...

93
Преобразование Drawable

Преобразование Drawable

Начал свое знакомство с Realm и столкнулся с проблемой что такие классы как Calendar и Drawable не поддерживаются Realm, оно и логичноCalendar я стал хранить...

134
Многоядерная обработка Java-программы

Многоядерная обработка Java-программы

Помогите разобраться с многоядерной обработкой Java-программы

109