Получение Gson MalformedJsonException: неопределенный массив - PullRequest
0 голосов
/ 26 мая 2018

Я создаю пользовательское приложение для клавиатуры.В методе onCreateInputView у меня есть следующий код внутри сопрограммы, который анализирует файл (используя JsonParser из библиотеки Gson) из https://github.com/vedantroy/image-test/raw/master/index.json.

Log.d("VED-APP","Parsing File From Github")
JsonParser().parse(fetchString("https://github.com/vedantroy/image-test/raw/master/index.json"))

, где fetchString() - следующий метод:

private suspend fun fetchString(url: String): String = suspendCoroutine { cont ->
    url.httpGet().header(Pair("pragma", "no-cache"), Pair("cache-control", "no-cache")).responseString { _, _, result ->
        //Log.d("VED-APP", r.toString())

        when (result) {
            is Result.Failure -> {
                cont.resumeWithException(result.getException())
            }
            is Result.Success -> {
                cont.resume(result.value)
            }
        }

    }
}

Приведенный выше код работает без ошибок.Я могу успешно разобрать файл, расположенный по URL, используя Gson.

Однако я получаю исключение, когда пытаюсь проанализировать файл (с таким же точным содержимым) из локального источника, а не из github, со следующим кодом.

val layoutFileName = "index.json"
val layoutFile =  File(filesDir, layoutFileName)


        //If layout file does not exist, create it and write default layout to file.
        if(!layoutFile.exists()) {
            Log.d("VED-APP","FILE DOES NOT EXIST")
            layoutFile.writeText(resources.getString(R.string.default_keyboard_layout))
        } else {
            Log.d("VED-APP","FILE EXISTS")

        }

        Log.d("VED-APP","Parsing Local File")
       JsonParser().parse(FileReader(layoutFile))

исключение:

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: неопределенный массив в строке 1, столбец 18, путь $ .Возбуждено 1

Вот содержимое записи default_keyboard_layout в strings.xml: Screenshot_Of_Strings.xml

Это очень странно, поскольку содержимое записи default_keyboard_layoutв strings.xml точно так же, как содержимое файла index.json на github.

Я сделал некоторую отладку, и я думаю, что нашел источник ошибки.Я добавил это в свой код, чтобы просмотреть содержимое index.json до его анализа

layoutFile.forEachLine {
            Log.d("VED-APP",it)
        }

, и получил следующий результат:

 { Excited:[https://github.com/vedantroy/image-test/raw/master/Happy/excited1.gif, https://github.com/vedantroy/image-test/raw/master/Happy/excited2.gif, https://github.com/vedantroy/image-test/raw/master/Happy/excited3.gif], Sad:[https://github.com/vedantroy/image-test/raw/master/Sad/sad1.gif, https://github.com/vedantroy/image-test/raw/master/Sad/sad2.gif, https://github.com/vedantroy/image-test/raw/master/Sad/sad3.gif, https://github.com/vedantroy/image-test/raw/master/Sad/sad4.gif] }

Две вещи странныеэтот вывод.

1) Все в одной строке, хотя запись в strings.xml и файл на github являются многострочными

2) Файл не имеет кавычек, хотя запись в strings.xmlи файл на github имеет кавычки.

Я подозреваю, что эти две проблемы являются источником проблемы, но я не уверен.

Почему я получаю это исключение и какЯ исправляю это?

Обновление 1 -

Я попробовал решение Тинна, изменив тоже strings.xml

<resources>
    <string name="app_name">Anime Face Keyboard</string>
    <string name="subtype_en_US">English (US)</string>
    <string name="default_keyboard_layout"><![CDATA[{
    "Excited":["https://github.com/vedantroy/image-test/raw/master/Happy/excited1.gif",
                "https://github.com/vedantroy/image-test/raw/master/Happy/excited2.gif",
                "https://github.com/vedantroy/image-test/raw/master/Happy/excited3.gif"],

    "Sad":["https://github.com/vedantroy/image-test/raw/master/Sad/sad1.gif",
            "https://github.com/vedantroy/image-test/raw/master/Sad/sad2.gif",
            "https://github.com/vedantroy/image-test/raw/master/Sad/sad3.gif",
            "https://github.com/vedantroy/image-test/raw/master/Sad/sad4.gif"]
}]]></string>
</resources>

, но это ничего не сделало.

Я напечатал значение resources.getString(R.string.default_keyboard_layout), но в нем все еще не было кавычек и новых строк.

1 Ответ

0 голосов
/ 26 мая 2018

Вы должны будете экранировать " как \" и новые строки как \n.

Поскольку строки определены в XML новых строкахсчитаются частью разметки, а " используются для определения строки, содержащей разметку, например, пробел в конце строки:

<string name="a">a </string>
<string name="b">"b "</string>

Здесь a просто "a", а b - "b ".

<string>"{\n
    \"key\": [\"value\"]\n
}\n"</string>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...