Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing json in Kotlin

I'm trying to parse Json in Kotlin. I'm having a lot of trouble, it seems that a lot of people learn Kotlin after Java... Not me, I'm a Python guy. I got a Kotlin Jupyter Notebook running fairly quickly (https://github.com/ligee/kotlin-jupyter), after that I managed to pull information from the bittrex api like so:

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

It took me a long time to find that I needed to add import java.net.URL, this always seems to be implicit in all code examples. Anyway, this give me a response in json (the "result parameter"):

{"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 ...

Now, in Python I'd just add .json() to the "result" parameter and I can then address the json fields as a dictionary with multiple levels, like

result["success"]

Would give me:

true

Is there something like that for Kotlin? I have tried Klaxon https://github.com/cbeust/klaxon, again it took me a lot of time to realize that I have to do import com.beust.klaxon.string, it is not mentioned on the website for example, so a side question is: How do you know what you need to import when you find code examples? It seems like everybody just knows... But I digress.

My main question is: How can I address the separate fields of the Json and get them into separate variables?

Highest regards.

like image 725
Freek Avatar asked Oct 28 '22 20:10

Freek


1 Answers

There are many JSON parsers out there. Your example was a Kotlin explicit one and that is not mandatory for Kotlin because there are also many basic Java parsers, which you can use just as fine in Kotlin.

For your imports. Obviously you need to import the classes you want to use and IDE's like IntelliJ handle the imports for you automatically. That means that you won't have to type any import statements, but they are added automatically when referencing those classes.

I think that nowadays some libraries just expect that you do not handle the imports yourself and thus do not assist you on finding the right imports.

My suggestion for a parser is Fuel. The library is optimized for Kotlin as well. Your problem would be solved with this simple code snippet with the help of 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")
    }
}
like image 164
creativecreatorormaybenot Avatar answered Nov 07 '22 22:11

creativecreatorormaybenot