-1

can you help me. i'm trying to get value from this json and its from socket.io but its return error. did i missing some step for parsing it?i'm new in this topic, thanks in advance

{
"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
}]

}

here's the 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)

here's my code for socket.io. btw im following the instruction from the official web of socket.io but it goes nowhere

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 ")
}

1 Answers1

0
val data = args[0] as JSONObject

You can't just cast it to a JSONObject, you need to pass the String to the constructor

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

However as you can see from the awkward code, it is more idiomatic in Kotlin to use kotlinx.serialization.

xjcl
  • 12,848
  • 6
  • 67
  • 89