获取Gson MalformedJsonException:未终止的数组

时间:2018-05-25 21:49:02

标签: android json kotlin gson

我正在创建一个自定义键盘应用。在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的内容: Screenshot_Of_Strings.xml

这很奇怪,因为default_keyboard_layoutstrings.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

,我尝试了Tynn的解决方案
<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 :(得分:0)

您必须将"转换为\",将新行转移为\n

由于字符串在 XML 中定义,新行被视为标记的一部分,而"用于定义包含标记的字符串,例如在行尾的空格:

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

此处a仅为"a"b"b "

<string>"{\n
    \"key\": [\"value\"]\n
}\n"</string>