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

时间:2017-07-03 10:43:06

标签: android kotlin rx-kotlin

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

在java中我实现了Asyntask以及从Url读取JSON的Rxjava。我也在谷歌搜索,但我无法获得有关我的要求的详细信息。

如何使用kotlin从Url读取JSON?

7 个答案:

答案 0 :(得分:5)

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

val apiResponse = URL("yourUrl").readText()

来自docs

  

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

     

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

请注意,如果您在Android活动中使用此功能,应用程序会崩溃,因为您使用异步调用阻止了主线程。为避免应用崩溃,建议您使用Anko。更准确地说,你只需要add the commons dependency - 不是整个图书馆 - 。

您可以找到更多信息in this blog post

答案 1 :(得分:4)

试试这个

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

答案 2 :(得分:1)

您可以在Kotlin中使用Volley或Retrofit库。实际上,您可以使用Kotlin中的所有Java库。

Volley更容易,但是比Volley更快地进行改装。你的选择。

Volley Link

Retrofit Link

答案 3 :(得分:1)

最后我从Here

获得答案

使用Retrofit 2.0读取Json数据 RxJava, RxAndroid, Kotlin Android Extensions。

  fun provideRetrofit(): Retrofit {
    return Retrofit.Builder()
            .baseUrl("https://www.example.com")
            .addConverterFactory(MoshiConverterFactory.create())
            .build()
    }

模块

interface  Api {
@GET("/top.json")
fun getTop(@Query("after") after: String,
           @Query("limit") limit: String): Call<NewsResponse>;
}

答案 4 :(得分:1)

readText()是Antonio Leiva在他的书籍Kotlin for Android Developers(以及根据dgrcode answer的博客文章中介绍网络时)使用的方法。但是我和#39;我不确定readText()是否通常是从URL请求JSON响应的正确方法,因为响应可能非常大(甚至Antonio提到肯定了Kotlin docs说readText有大小限制的事实)。根据{{​​3}},您应该使用流而不是readText。我希望看到使用该方法或Kotlin中最简洁和最优的方法对此答案的响应,而不添加库依赖项。

另见this discussion

另请注意,对于readText()不适合的情况,Antonio确实在该博客文章中提供了替代方案。我很乐意看到有人在适当或不适当的时候提供一些明确的信息。

答案 5 :(得分:0)

我有一个fragment_X(类+布局),我想在其中读取在线Json文件(您也可以读取txt文件),并将内容显示给TextView。

==>注意:赋予应用程序访问Manifest中Internet的权利。

class Fragment_X: Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_X, container, false)

    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        if(isNetworkAvailable()) {
            val myRunnable = Conn(mHandler)
            val myThread = Thread(myRunnable)
            myThread.start()
        }
    }


    // create a handle to add message
    private val mHandler: Handler = object : Handler(Looper.getMainLooper()) {
        override fun handleMessage(inputMessage: Message) { if (inputMessage.what == 0) {
            textView.text = inputMessage.obj.toString() }
        } }

    // first, check if network is available.
    private fun isNetworkAvailable(): Boolean { val cm = requireActivity().getSystemService(
        Context.CONNECTIVITY_SERVICE
    ) as ConnectivityManager
        return cm.activeNetworkInfo?.isConnected == true
    }


    //create a worker with a Handler as parameter
    class Conn(mHand: Handler): Runnable {
        val myHandler = mHand
        override fun run() {
            var content = StringBuilder()
            try {
                // declare URL to text file, create a connection to it and put into stream.
                val myUrl = URL("http:.........json")  // or URL to txt file
                val urlConnection = myUrl.openConnection() as HttpURLConnection
                val inputStream = urlConnection.inputStream

                // get text from stream, convert to string and send to main thread.
                val allText = inputStream.bufferedReader().use { it.readText() }
                content.append(allText)
                val str = content.toString()
                val msg = myHandler.obtainMessage()
                msg.what = 0
                msg.obj = str
                myHandler.sendMessage(msg)
            } catch (e: Exception) {
                Log.d("Error", e.toString())
            }
        }

    }

}

答案 6 :(得分:0)

您可以使用RequestQueue:https://developer.android.com/training/volley/requestqueue

val textView = findViewById<TextView>(R.id.text)
// ...

// Instantiate the RequestQueue.
val queue = Volley.newRequestQueue(this)
val url = "https://www.google.com"

// Request a string response from the provided URL.
val stringRequest = StringRequest(Request.Method.GET, url,
        Response.Listener<String> { response ->
            // Display the first 500 characters of the response string.
            textView.text = "Response is: ${response.substring(0, 500)}"
        },
        Response.ErrorListener { textView.text = "That didn't work!" })

// Add the request to the RequestQueue.
queue.add(stringRequest)