Разбор json в Котлине

Я пытаюсь разобрать Json в Kotlin. У меня много проблем, кажется, что многие люди изучают Kotlin после Java... Не я, я парень из Python. Я запустил ноутбук Kotlin Jupyter довольно быстро ( https://github.com/ligee/kotlin-jupyter), после чего мне удалось получить информацию из API-интерфейса bittrex, например, так:

import java.net.URL
val result = URL("https://bittrex.com/api/v1.1/public/getmarkets").readText()

Мне потребовалось много времени, чтобы найти, что мне нужно добавить импорт java.net.URL, это всегда кажется неявным во всех примерах кода. Во всяком случае, это дает мне ответ в json ("параметр результата"):

{"success":true,"message":"","result":[{"MarketCurrency":"LTC","BaseCurrency":"BTC","MarketCurrencyLong":"Litecoin","BaseCurrencyLong":"Bitcoin","MinTradeSize":0.01469482,"MarketName":"BTC-LTC","IsActive":true,"Created":"2014-02-13T00:00:00","Notice":null,"IsSponsored":null,"LogoUrl":"https://bittrexblobstorage.blob.core.windows.net/public/6defbc41-582d-47a6-bb2e-d0fa88663524.png"},{"MarketCurrency":"DOGE","BaseCurrency":"BTC","MarketCurrencyLong":"Dogecoin","BaseCurrencyLong":"Bitcoin","MinTradeSize":274.72527473,"MarketName":"BTC-DOGE","IsActive":true,"Created":"2014-02-13T00:00:00","Notice":null,"IsSponsored":null,"LogoUrl":"https://bittrexblobstorage.blob.core.windows.net/public/a2b8eaee-2905-4478-a7a0-246f212c64c6.png"},{"MarketCurrency ...

Теперь в Python я просто добавлю.json() к параметру "result", и тогда я смогу обращаться к полям json в виде словаря с несколькими уровнями, например

result["success"]

Дал бы мне:

true

Есть ли что-то подобное для Котлина? Я попробовал Klaxon https://github.com/cbeust/klaxon, снова мне потребовалось много времени, чтобы понять, что я должен сделать import com.beust.klaxon.stringНапример, он не упоминается на веб-сайте, поэтому побочный вопрос: как узнать, что нужно импортировать, когда вы найдете примеры кода? Кажется, что все просто знают... Но я отвлекся.

Мой главный вопрос: как я могу обратиться к отдельным полям Json и преобразовать их в отдельные переменные?

С наилучшими пожеланиями.

2 ответа

Есть много парсеров JSON. Ваш пример был явным Kotlin, и он не является обязательным для Kotlin, потому что есть также много базовых парсеров Java, которые вы можете использовать так же хорошо в Kotlin.

Для вашего импорта. Очевидно, вам нужно импортировать классы, которые вы хотите использовать, и IDE, такие как IntelliJ, автоматически выполнят импорт для вас. Это означает, что вам не придется вводить какие-либо import операторы, но они добавляются автоматически при обращении к этим классам.

Я думаю, что в настоящее время некоторые библиотеки ожидают, что вы сами не справляетесь с импортом и, следовательно, не помогаете вам найти правильный импорт.

Мое предложение для парсера - Fuel. Библиотека оптимизирована и для Kotlin. Ваша проблема будет решена с помощью этого простого фрагмента кода с помощью Fuel:

"https://bittrex.com/api/v1.1/public/getmarkets".httpGet().responseJson { _, response, result ->
    if (response.responseMessage == "OK" && response.statusCode == 200) {
        val yourResult = result.get().obj().getBoolean("success")
    }
}

Что-то, что вы можете знать или не знать, это то, что Kotlin на 100% совместим с Java, поэтому все парсеры Java json хорошо работают с Kotlin. Я очень рекомендую GSON. Это маленький (~200 КБ), быстрый и довольно простой в использовании.

Если этот код выполняется на сервере, Джексон довольно стандартен. Это самый производительный парсер json для java на данный момент, но он очень тяжелый. Однако потребуется более сложная конфигурация, и я думаю, что для этого могут потребоваться некоторые специальные модули Kotlin.

Я еще не пробовал, так как он официально не был выпущен, но Kotlin предлагает плагин для генерации кода сериализации json. Это, вероятно, в конечном итоге станет стандартным способом сериализации / десериализации Kotlin, поскольку теоретически он должен быть наиболее производительным.

Лучшая и быстрая практика - вместо ручной проверки каждого ключа генерировать собственные "классы данных" Kotlin с помощью инструментов, например https://json2kotlin.com/

Таким образом, ваш ответ API превращается в следующую пару классов данных, соответствующих структуре JSON:

data class Json4Kotlin_Base (

    val success : Boolean,
    val message : String,
    val result : List<Result>
)

а также

data class Result (

    val marketCurrency : String,
    val baseCurrency : String,
    val marketCurrencyLong : String,
    val baseCurrencyLong : String,
    val minTradeSize : Double,
    val marketName : String,
    val isActive : Boolean,
    val isRestricted : Boolean,
    val created : String,
    val notice : String,
    val isSponsored : String,
    val logoUrl : String
)

Получив результат, вы просто сопоставляете ответ JSON с этими классами данных. Видео здесь показывает, как сделать это шаг за шагом.

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