Я создаю пользовательское приложение для клавиатуры.В методе 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
:
Это очень странно, поскольку содержимое записи 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)
, но в нем все еще не было кавычек и новых строк.