使用kotlin开发应用程序。现在我想从服务器获取JSON数据。
在java中我实现了Asyntask以及从Url读取JSON的Rxjava。我也在谷歌搜索,但我无法获得有关我的要求的详细信息。
如何使用kotlin从Url读取JSON?
答案 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更快地进行改装。你的选择。
答案 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中最简洁和最优的方法对此答案的响应,而不添加库依赖项。
另请注意,对于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)