【发布时间】: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 代码返回多个字符串。我想这就是这里的问题。我尝试修复它。谢谢你的帮助! :)