【问题标题】:Kotlin - Invalid escape sequence: 0 when parsing to JSONObjectKotlin - 无效的转义序列:解析为 JSONObject 时为 0
【发布时间】:2021-07-27 13:21:34
【问题描述】:

我正在尝试解析一个大的 json 文件(>76K 字符)并从中读取两个区域以将它们映射到 WebView。

我的问题是我在解析它时收到 JSONExceptions 并且我无法重建错误。

这是我的 callVM 类,其中包含该功能。

fun callVM() 
    var url: String = getString(R.string.app_name)//R.string.myHtml


    try {
        //read url via getTermsString 
        url = getTermsString()

        val gson = Gson()
        var decodedHtml = unescape(url)
        readJson(decodedHtml)

        wv_map.loadData(decodedHtml, "text/html; charset=UTF-8", null);

    } catch (e: Exception) {
        Log.e("FAIL", "Initializing failed")
        e.printStackTrace()
    }
}

getTermsString() 函数读取“url”,在本例中是我的 api_response_jreal.json,没有 url。命名是旧的。 api_response_jreal.json 在我的原始文件夹中。

private fun getTermsString(): String {
    Log.e("gts", "Start getTermsString()")
    val ist: InputStreamReader

    try {
        Log.e("Reader", "Start reader")

        //R.raw.x - x equals the html file
        ist = InputStreamReader(resources.openRawResource(R.raw.api_response_jreal))
        val theString = IOUtils.toString(ist)

        Log.e("gtsfin", "getTermsString() finished")
        ist.close()
        return theString
    } catch (e: IOException) {
        System.err.println(e.printStackTrace())
    }
    return "gts did not load anything."
}

我的 unescape 函数用于替换转义字符。我也尝试在不转义的情况下调用 readJson 函数,但这也不起作用......

 fun unescape(str: String) : String
{
    var strVar = str
    strVar = strVar
        // ADDED AFTER THE FIRST EXCEPTION.replace("\\u0","\\u003d")
        .replace("\\u003d","=")
        .replace("\\u003c","<")
        .replace("\\u003e",">")
        .replace("\\u0027","'")
        .replace("\\\"", "")
        .replace("\\t", "    ")
        .replace("\\u0023", "#")
        .replace("\\u0024", "$")
        .replace("\\u0025", "%")
        .replace("\\u0026", "&")
        .replace("\\u0028", "(")
        .replace("\\u0029", ")")
        .replace("\\u002A", "*")
        .replace("\\u002B", "+")
        .replace("\\u002C", ",")
        .replace("\\u002D", "-")
        .replace("\\u002E", ".")
        .replace("\\u002F", "/")
        .replace("\\u003A", ":")
        .replace("\\u003B", ";")
        .replace("\\u003F", "?")
        .replace("\\u0040", "@")
        .replace("/\\n/g", "\\n")
        .replace("/\\'/g", "\\'")
        .replace("/\\&/g", "\\&")
        .replace("/\\r/g", "\\r")
        .replace("/\\t/g", "\\t")
        .replace("/\\b/g", "\\b")
        .replace("/\\f/g", "\\f")
        .replace("\\s+", " ")
        .replace("\\\n","")
        .replace("\\n","")

    return strVar
}

最后但并非最不重要的一点是,我尝试将未转义的 json 转换为对象以访问所需的值(我只需要“regionsToSvgMapping)”

fun readJson(url : String){
    val data = JSONObject(url)
    Log.e("readjsn obj", "MyFile: " + data)
}

现在出现了两个例外。 第一个是“无效的转义序列:0”......

我在 Notepad++ 中复制了整个字符串并查看字符“3051”..

    <polygon id\u0
    03d12                  

然后我尝试了一些愚蠢的方法,并认为最愚蠢的方法会起作用,并在我的 unescape 函数中添加了第一个 .replace 值。那么最愚蠢的方法是行不通的......;)

现在是我没有解决该问题并询问 stackoverflow 社区的时候了。

我也尝试使用代码美化器来检查json是否完整,这样应该没问题。

谢谢大家的帮助!

【问题讨论】:

  • 不是这个问题的答案,但假设这是一个新项目,你真的不应该将 gson 与 kotlin 一起使用,它的构造函数和 null 安全性不能很好地发挥作用,jackson(与 kotlin模块)、moshi 和 kotlinx-serialization 都旨在与 kotlin 一起使用(并且仍在积极开发中,与 gson 不同)
  • 你试过最小化json并重现错误吗?如果您可以共享导致问题的 json,那将会很有帮助。
  • Invalid escape sequence: 0 指向错误的字符代码\0。为什么0后有换行符?显然它应该是\u003d,没有换行符。来自服务器的原始 json 是这样吗?
  • 很抱歉回答迟了。我注意到我的转义字符串 - 输出是多个字符串。这意味着我的 .replace 代码返回多个字符串。我想这就是这里的问题。我尝试修复它。谢谢你的帮助! :)

标签: android json kotlin


【解决方案1】:

解决方案是使用 StringBuilder。

在处理大于 10k 个数字和数字的字符串时,我的 Android 工作室将大字符串拆分为多个字符串,其中包含大约 1k 个数字和数字。

为了解决这个问题,我使用了这样的字符串生成器,..

fun unescape(str: String) : String
{
    var stringBuilder = StringBuilder()
    var strVar = str
    strVar = strVar
        .replace("\\u003d","=")
        .replace("\u003d","=")
        .replace("\\u003c","<")
        .... (see above)

    stringBuilder.append(strVar)
    return stringBuilder.toString()
}

【讨论】:

    猜你喜欢
    • 2021-07-25
    • 1970-01-01
    • 2018-02-10
    • 2015-10-16
    • 1970-01-01
    • 2014-08-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多