你能帮我解决这个问题"java.lang.ClassCastException: java.lang.String cannot be cast to org.json.JSONObject"



你能帮我吗?我正试图从这个json和它的socket.io中获取值,但它的返回错误。我是不是错过了解析它的步骤?我是这个话题的新手,提前谢谢

{
"items": [{
"id": 1,
"name": "Ayam Goreng",
"price": 13000,
"photo": "https://i.ytimg.com/vi/gWCCEbhiAek/maxresdefault.jpg",
"discount": 0,
"flashsale": 0,
"alias": null
}, {
"id": 4,
"name": "string",
"price": 150000,
"photo": "https://images.tokopedia.net/img/cache/900/hDjmkQ/2020/9/5/61fb1a77-31fa-4de3-a47a-a23d9964ef6e.jpg",
"discount": 0,
"flashsale": 0,
"alias": null
}]

}

这是Logcat

2021-05-06 10:19:27.672 12509-12612/com.berkat.quicky E/EventThread: Task threw exception
java.lang.ClassCastException: java.lang.String cannot be cast to org.json.JSONObject
at com.berkat.quicky.viewmodel.CartViewModel$onNewMessage$1.call(CartViewModel.kt:26)
at io.socket.emitter.Emitter.emit(Emitter.java:117)
at io.socket.client.Socket.onevent(Socket.java:318)
at io.socket.client.Socket.onpacket(Socket.java:269)
at io.socket.client.Socket.access$100(Socket.java:18)
at io.socket.client.Socket$2$2.call(Socket.java:88)
at io.socket.emitter.Emitter.emit(Emitter.java:117)
at io.socket.client.Manager.ondecoded(Manager.java:368)
at io.socket.client.Manager.access$1300(Manager.java:22)
at io.socket.client.Manager$5.call(Manager.java:346)
at io.socket.parser.IOParser$Decoder.add(IOParser.java:101)
at io.socket.client.Manager.ondata(Manager.java:353)
at io.socket.client.Manager.access$900(Manager.java:22)
at io.socket.client.Manager$2.call(Manager.java:325)
at io.socket.emitter.Emitter.emit(Emitter.java:117)
at io.socket.engineio.client.Socket.onPacket(Socket.java:558)
at io.socket.engineio.client.Socket.access$1000(Socket.java:36)
at io.socket.engineio.client.Socket$5.call(Socket.java:337)
at io.socket.emitter.Emitter.emit(Emitter.java:117)
at io.socket.engineio.client.Transport.onPacket(Transport.java:124)
at io.socket.engineio.client.Transport.onData(Transport.java:116)
at io.socket.engineio.client.transports.WebSocket.access$100(WebSocket.java:23)
at io.socket.engineio.client.transports.WebSocket$1$2.run(WebSocket.java:73)
at io.socket.thread.EventThread$2.run(EventThread.java:80)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:914)

这是我为socket.io编写的代码。顺便说一句,我按照socket.io官方网站上的说明编写,但没有任何进展

private val onNewMessage =
Emitter.Listener { args ->
val data = args[0] as JSONObject
val username: String
val message: String
try {
username = data.getString("name")
message = data.getString("message")
Log.d("TAG", "$username: ")
} catch (e: JSONException) { }
}
suspend fun getItemsCart() {
val mSocket = IO.socket("http://103.102.153.138:8000/")
mSocket.on(Socket.EVENT_CONNECT) { println("connected") }
mSocket.connect()
mSocket.on("cart", onNewMessage)
Log.d("TAG", "getItemsCart: GET CHART ")
}
val data = args[0] as JSONObject

不能只将其强制转换为JSONObject,需要将String传递给构造函数

import org.json.JSONObject  // only on Android
// I am not sure if you get the content string this way, do adjust
val s = args[0]
val data = JSONObject(s)
val arr = data.getJSONArray("items")
for (i in 0 until arr.length()) {
val item = arr.getJSONObject(i)
Log.i("item", "$i: name=${item.getString("name")}")
}
0: name=Ayam Goreng
1: name=string

然而,正如您从笨拙的代码中看到的,在Kotlin中使用kotlinx.serialization更为惯用。

相关内容

最新更新