在Kotlin解析json

我试图在Kotlin中解析Json。 我遇到了很多麻烦,似乎很多人学习Java之后的Kotlin …不是我,我是一个Python家伙。 我得到了一个Kotlin Jupyter笔记本,运行速度相当快( https://github.com/ligee/kotlin-jupyter ),之后我设法从bittrex api中获取信息,如下所示:

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

我花了很长时间才发现我需要添加import 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":"json/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":"json/a2b8eaee-2905-4478-a7a0-246f212c64c6.png"},{"MarketCurrency ... 

现在,在Python中,我只是将“json()”添加到“result”参数中,然后我可以将json字段作为具有多个级别的字典来处理,例如

 result["success"] 

会给我:

 true 

有没有像Kotlin那样的东西? 我试过了Klaxon https://github.com/cbeust/klaxon ,又花了我很多时间才意识到我要import com.beust.klaxon.string ,在网站上没有提到例如,所以一个侧面的问题是:当你find代码示例时,你怎么知道你需要导入什么? 似乎每个人都知道…但我离题了。

我的主要问题是:如何解决Json的单独字段并将它们分解为单独的variables?

最高的问候。

你可能会或可能不知道的一点是,Kotlin与Java 100%兼容,因此所有的Java json解析器都可以和Kotlin一起使用。 我强烈推荐gson 。 它很小(〜200kb),速度快,而且使用起来非常简单。

如果这个代码在服务器上运行,jackson是非常标准的。 这是目前最高性能的json解析器,但它非常重。 虽然这将需要一些更复杂的配置,我想这可能需要一些Kotlin特定的模块。

我还没有试过,因为它还没有正式发布,但是Kotlin提供了一个用于生成json序列化代码的插件 。 这可能最终成为Kotlin序列化/反序列化的标准方式,理论上应该是性能最高的。

那里有很多JSON解析器。 你的例子是一个Kotlin显式的例子,这对于Kotlin来说不是强制性的,因为也有很多基本的Java解析器,你可以在Kotlin中使用。

对于你的import。 显然你需要导入你想要使用的类,像IntelliJ这样的IDE自动处理导入。 这意味着您不必输入任何import语句,但是在引用这些类时会自动添加它们。

我想现在有些图书馆只是希望你不要自己处理import,因此不能帮你find合适的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") } }