Разбор 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 с этими классами данных. Видео здесь показывает, как сделать это шаг за шагом.