如何使用kotlin Android从Url读取JSON?

sas*_*mar 1 android kotlin rx-kotlin

我正在使用kotlin开发应用程序.现在我想从服务器获取JSON数据.

在java中我实现了Asyntask以及Rxjava,用于从Url读取JSON.我也在谷歌搜索,但我无法得到我的要求的正确细节.

如何使用kotlin从Url读取JSON?

Dan*_*ina 5

我想你正在尝试从服务器API读取响应,你希望它是一个带有JSON的字符串.为此,您可以使用:

val apiResponse = URL("yourUrl").readText()
Run Code Online (Sandbox Code Playgroud)

来自文档:

使用UTF-8或指定的字符集将此URL的全部内容读取为String.

不建议在大文件上使用此方法.

请注意,如果您在Android活动中使用此功能,应用程序会崩溃,因为您使用异步调用阻止了主线程.为避免应用程序崩溃,我建议您使用Anko.更准确地说,您只需添加公共依赖项 - 而不是整个库 - .

您可以在此博客文章中找到更多信息

  • @ Paul-Sebastian不仅它回答了这个问题,而且它是唯一一个在不使用Java库的情况下解决问题的方法.怎么会误导? (3认同)
  • Anko 库现已弃用,因此请更新您的评论。 (2认同)

Fua*_*mal 5

更新/注意:我已经在此处编写了有关此主题的完整分步教程。虽然由您决定使用哪些第三方库(其他答案中提到了一些),但 Retrofit 是迄今为止使用的事实上的标准。此外,它还内置了对协程的支持。如果您使用协程而不是旧的回调方法,您的网络代码应该是异步的,并且您的代码将更加干净,更易于遵循和调试等。上述教程甚至向您展示了如何轻松地从回调更新旧代码以使用协程。

readText() 是 Antonio Leiva 在他的《Kotlin for Android Developers》一书中介绍网络时使用的方法(以及根据dgrcode答案在博客文章中)但是我不确定 readText() 是否是一般的正确方法用于从 URL 请求 JSON 响应,因为响应可能非常大(甚至 Antonio 也提到确认 Kotlin 文档说 readText 存在大小限制)。根据此讨论,您应该使用流而不是 readText。我希望看到使用该方法或 Kotlin 中最简洁和最佳的方法对此答案的响应,而不添加库依赖项。

另请参阅此线程

另请注意,Antonio 确实在该博客文章中为 readText() 不是适当选择的情况提供了替代方案。我很乐意看到有人澄清什么时候合适或不合适。


Ank*_*are 4

尝试这个

fun parse(json: String): JSONObject? {
        var jsonObject: JSONObject? = null
        try {
            jsonObject = JSONObject(json)
        } catch (e: JSONException) {
            e.printStackTrace()
        }
        return jsonObject
    }
Run Code Online (Sandbox Code Playgroud)