Десериализация неизвестного json с помощью Gson

У меня есть бесплатный api для отслеживания валюты с помощью json: api.coinmarketcap Мне нужно десериализовать этот json в мой составной объект java с библиотекой Gson. Это мой объект модели:

public class Quote {
    @SerializedName("quotes")
    private String mName;
    @SerializedName("price")
    private double mPrice;

    public Quote(String name, double price) {
        mName = name;
        mPrice = price;
    }

    public String getName() {
        return mName;
    }

    public double getPrice() {
        return mPrice;
    }
}

а также:

public class Currency {
    private int mId;
    private String mSymbol;
    private byte mRank;
    private String mWebsiteSlug;
    private int mMaxSupply;
    private Quote mQuote;

    public Currency(int id, String symbol, byte rank, String websiteSlug, int maxSupply) {
        mId = id;
        mSymbol = symbol;
        mRank = rank;
        mWebsiteSlug = websiteSlug;
        mMaxSupply = maxSupply;
    }

    public int getId() {
        return mId;
    }

    public String getSymbol() {
        return mSymbol;
    }

    public byte getRank() {
        return mRank;
    }

    public String getWebsiteSlug() {
        return mWebsiteSlug;
    }

    public int getMaxSupply() {
        return mMaxSupply;
    }

    public Quote getQuote() {
        return mQuote;
    }
}

Я не могу десериализовать с такой вложенностью.

Пожалуйста, опубликуйте содержимое JSON и ошибку.

sbso 12.09.2018 15:07

@sb, так что я не могу. Stack Overflow скажите мне: похоже, ваш пост - это в основном код; пожалуйста, добавьте более подробную информацию. Но нечего сказать

Iliya Mashin 12.09.2018 15:25

У него есть ключ как значение. Такой Json сложно разобрать и создать на его основе POJO.

Chintan Rathod 12.09.2018 15:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать введите описание ссылки здесь для создания ваших классов pojo из json

Но здесь слишком много шелухи. Хотелось бы кастомный десериализатор или еще какой. Но я запутался в иерархии

Iliya Mashin 12.09.2018 15:51

Вы можете использовать этот gist.github.com/IamEgor/11bdc913bc9b0ba83bd9e80d8720e382

Yegor Gruk 12.09.2018 17:00

спасибо, чувак. Я не знал, что можно использовать Map <String, Currency> вот так. Для синтаксического анализа составного вложения

Iliya Mashin 12.09.2018 18:32
Ответ принят как подходящий

Создаю десериализатор валюты:

public class CurrencyDeserializer implements JsonDeserializer<Currency> {
    @Override
    public Currency deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

        Currency currency = new Currency();

        JsonObject currencyObject = json.getAsJsonObject();

        JsonElement id = currencyObject.get("id");
        if (!id.isJsonNull()) {
            currency.setId(id.getAsInt());
        }

        JsonElement name = currencyObject.get("name");
        if (!name.isJsonNull()) {
            currency.setName(name.getAsString());
        }

        JsonElement symbol = currencyObject.get("symbol");
        if (!symbol.isJsonNull()) {
            currency.setSymbol(symbol.getAsString());
        }

        JsonElement slug = currencyObject.get("website_slug");
        if (!slug.isJsonNull()) {
            currency.setWebsiteSlug(slug.getAsString());
        }

        JsonElement rank = currencyObject.get("rank");
        if (!rank.isJsonNull()) {
            currency.setRank(rank.getAsLong());
        }

        JsonElement circulatingSupply = currencyObject.get("circulating_supply");
        if (!circulatingSupply.isJsonNull()) {
            currency.setCirculatingSupply(circulatingSupply.getAsLong());
        }

        JsonElement totalSupply = currencyObject.get("total_supply");
        if (!totalSupply.isJsonNull()) {
            currency.setTotalSupply(totalSupply.getAsLong());
        }

        JsonElement maxSupply = currencyObject.get("max_supply");
        if (!maxSupply.isJsonNull()) {
            currency.setMaxSupply(maxSupply.getAsLong());
        }

        JsonElement lastUpdated = currencyObject.get("last_updated");
        if (!lastUpdated.isJsonNull()) {
            Long l = lastUpdated.getAsLong() * 1000;
            currency.setLastUpdated(new Date(l));
        }

        JsonObject quotes = currencyObject.get("quotes").getAsJsonObject();

        for(Map.Entry<String, JsonElement> rootObj : quotes.entrySet())
        {
            Quote quote = context.deserialize(rootObj.getValue(), Quote.class);
            quote.setName(rootObj.getKey());
            currency.addQuote(quote);
        }

        return currency;
    }
}

Просто и работает

Другие вопросы по теме