gpt4 book ai didi

kotlin - Kotlin-如何在URL上读取JSON字符串

转载 作者:行者123 更新时间:2023-12-02 12:48:18 25 4
gpt4 key购买 nike

我是Kotlin的新手,我找到了Klaxon库来解析JSON。我找不到如何执行url(http://localhost:8080/items/2),读取JSON字符串并将数据保存到变量并将它们打印到控制台的方法。我不需要保存CreatedAt和UpdatedAt。

网址中的JSON:

{
"brand": "Ferrero",
"name": "Nutella",
"healthy": false,
"date": "2017-03-14T00:00:00.000Z",
"id": 2,
"createdAt": "2018-03-14T13:33:22.000Z",
"updatedAt": "2018-03-20T21:23:44.000Z"
}

码:
class DetailItem : AppCompatActivity()  {
var itemId : String = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail_item)
itemId = intent.getStringExtra("itemId")
}

override fun onResume() {
super.onResume()
example()
}

private fun parse(name: String) : Any{
val cls = Parser::class.java
val inputStream = cls.getResourceAsStream(name)!!
return Parser().parse(inputStream)!!
}

private fun example(){
val url = "http://192.168.99.100:8080/items/" + itemId
val obj = parse("url") as JsonObject

val brand = obj.string("brand")
val name = obj.string("name")
println(brand + name)
}

最佳答案

问题是方法cls.getResourceAsStream(name)返回null,而!!运算符导致NPE抛出。

为什么cls.getResourceAsStream(name)返回null?发生这种情况是因为方法getResourceAsStream在您在项目中提供的资源中搜索具有提供的name的资源(即文件)。

但是,根据您的情况,您想从URL下载JSON,因此需要首先执行下载,这将为您提供String(或可以转换为String的形式)形式的JSON,然后进行解析带有Parser().parse(yourJsonString) as JsonObject的字符串。

编辑

这是一个使用OkHttp库的示例:

import com.beust.klaxon.Klaxon
import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.io.IOException

fun main(args: Array<String>) {
val url = "https://jsonplaceholder.typicode.com/posts/1"

val client = OkHttpClient()
val request = Request.Builder()
.url(url)
.build()

println(Thread.currentThread())
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call?, e: IOException?) {
e?.printStackTrace()
}

override fun onResponse(call: Call?, response: Response) {
if (!response.isSuccessful) {
System.err.println("Response not successful")
return
}
val json = response.body()!!.string()
val myData = Klaxon().parse<MyData>(json)
println("Data = $myData")
println(Thread.currentThread())
}

})
// Shutdown the executor as soon as the request is handled
client.dispatcher().executorService().shutdown()
}

data class MyData(val title: String, val userId: Int)

REST API返回的JSON字符串为:
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipitsuscipit recusandae consequuntur expedita et cumreprehenderit molestiae ut ut quas totamnostrum rerum est autem sunt rem eveniet architecto"
}

该代码显示:
Thread[main,5,main]
Data = MyData(title=sunt aut facere repellat provident occaecati excepturi optio reprehenderit, userId=1)
Thread[OkHttp https://jsonplaceholder.typicode.com/...,5,main]

请注意 onResponse回调是在辅助线程上执行的,而不是在主线程上执行的,因此,如果您在Android中使用此代码,则无法从那里更改UI元素(除非您使用 runOnUiThread()或类似技术)

关于kotlin - Kotlin-如何在URL上读取JSON字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49394844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com