Android Kotlin JSONObject не может быть приведен - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь преобразовать строку JSON в объект класса данных JSON.Компилятор не жалуется, в Android Studio 3 IDE предусмотрены необходимые подсказки для исправления кода.Тем не менее я получаю сообщение об ошибке выполнения, в котором говорится, что JSONObject не может быть приведен.Пожалуйста, любые подсказки ...

У меня есть следующий код:

fun startReplay() {
    doAsync {
        triggerServerFile(eventDomain + "/get-replay-JSON.php")
        val jsonString = getServerFile(eventDomain + "/data/replay-SidR2018.json?nocache=" + Math.random())
        uiThread {
            var replayData:replayDataObject = JSONObject(jsonString) as replayDataObject
            val a= replayData.component1()
            val b= replayData.component2()[3].component3()
        }
    }
}

и следующие классы данных:

data class replayDataObject(
    val event: String,
    val shiptracks: List<Shiptrack>,
    val windtracks: List<Windtrack>
)

data class Shiptrack(
    val colorcode: String,
    val course: List<String>,
    val lat: List<String>,
    val lon: List<String>,
    val name: String,
    val speed: List<String>,
    val stamp: List<String>
)

data class Windtrack(
    val course: List<String>,
    val lat: List<String>,
    val lon: List<String>,
    val name: String,
    val speed: List<String>,
    val stamp: List<String>
)

и, наконец, следующая строка JSON:

{
    "event": "SidR2018,Slag in de Rondte 2018",
    "shiptracks": [{
            "name": "Hollandia",
            "colorcode": "0",
            "stamp": ["1541407570", "1541407599"],
            "lat": ["53.173461666667", "53.17347"],
            "lon": ["5.409655", "5.409655"],
            "speed": ["0", "0"],
            "course": ["299", "301"]
        }, {
            "name": "Ouderzorg",
            "colorcode": "14",
            "stamp": ["1541407540", "1541407540", "1541407540"],
            "lat": ["53.17359", "53.17359", "53.17359"],
            "lon": ["5.409586", "5.409586", "5.409586"],
            "speed": ["0", "0", "0"],
            "course": ["0", "0", "0"]
        }
    ],
    "windtracks": [{
            "name": "Arcen",
            "stamp": ["1541409000", "1541411400"],
            "lat": ["51.5", "51.5"],
            "lon": ["6.2", "6.2"],
            "speed": ["4", "2"],
            "course": ["72", "61"]
        }, {
            "name": "Zeeplatform K13",
            "stamp": ["1541408400", "1541410800", "1541412000", "1541414400"],
            "lat": ["53.22", "53.22", "53.22", "53.22"],
            "lon": ["3.22", "3.22", "3.22", "3.22"],
            "speed": ["16", "16", "17", "16"],
            "course": ["126", "129", "127", "120"]
        }
    ]
}

Трассировка стека (строка 381 - это строка в коде, содержащая JSOBObject: E / AndroidRuntime: FATAL EXCEPTION: main Процесс: nl.zeilvaartwarmond.ttandroid.szwtracktrace, PID: 23370 java.lang.ClassCastException:org.json.JSONObject не может быть приведен к nl.zeilvaartwarmond.ttandroid.szwtracktrace.MapsActivity $ replayDataObject по адресу nl.zeilvaartwarmond.ttandroid.szwtracktrace.MapsActivity $ startReplay $ 1 $ 1.inart.tv. att.szwtracktrace.MapsActivity $ startReplay $ 1 $ 1.invoke (MapsActivity.kt: 44) в org.jetbrains.anko.AsyncKt $ uiThread $ 1.run (Async.kt: 70) в android.os.Handler.handleCallback (Handler.java:898)) на android.os.Handler.dispatchMessage (Handler.java:107) на android.os.Looper.loop (Looper.java:198) на android.app.ActivityThread.main (ActivityThread.java:6716) на java.lang,refle.Method.invoke (собственный метод) в com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit.java:493) в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:858)

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Модифицированная работа для вас.Получить JSON с сервера и преобразовать в объект.

https://square.github.io/retrofit/

0 голосов
/ 25 ноября 2018

Вам нужно что-то, что интерпретирует JSON, чтобы сопоставить это с replayDataObject.В Kotlin data class es очень хороши в этом, используя любую из нескольких библиотек.

Google Gson

https://github.com/google/gson

ПослеИнициализируя Gson, вы просто взяли бы это String:

gson.fromJson(jsonString, replayDataObject::class.java)

Теперь, предупреждающее слово, у вас есть много необнуляемых типов, и могут быть проблемы с даннымивы читаете или что вы ожидаете от него.

Другие библиотеки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...