我正在创建一个自定义键盘应用。在onCreateInputView
方法中,我在协程中包含以下代码,该协程从https://github.com/vedantroy/image-test/raw/master/index.json解析文件(使用Gson库中的JsonParser
)。
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)
}
}
}
}
上面的代码工作正常,没有任何错误。我可以使用Gson成功解析位于URL的文件。
但是,当我尝试使用以下代码从本地源代替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列路径的未终止数组$ .Excited 1
以下是default_keyboard_layout
中条目strings.xml
的内容:
这很奇怪,因为default_keyboard_layout
中strings.xml
条目的内容与github上index.json文件的内容完全相同。
我做了一些调试,我想我找到了错误的来源。
我将此添加到我的代码中,以便在解析之前查看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)
的值,但仍然缺少引号和换行符。
答案 0 :(得分:0)
您必须将"
转换为\"
,将新行转移为\n
。
由于字符串在 XML 中定义,新行被视为标记的一部分,而"
用于定义包含标记的字符串,例如在行尾的空格:
<string name="a">a </string>
<string name="b">"b "</string>
此处a
仅为"a"
而b
为"b "
。
<string>"{\n
\"key\": [\"value\"]\n
}\n"</string>