Android WebView新旧版本JSON解析行为差异及修复方案咨询
问题解答
1. WebView内核调整导致解析行为差异的原因
Chromium内核从91版本开始(对应WebView 91+正式版本)调整了JavascriptInterface接口的参数传递逻辑:对于JS侧传递给Native侧的字符串参数,如果包含双引号、逗号等URI保留字符,内核会自动对字符串做一次URL编码后再传递给Native层。
旧版WebView(80及更早版本)不存在该自动编码逻辑,JS侧输出的原始JSON字符串会直接传递到Kotlin层,因此可以直接完成解析。
报错的根因是新版WebView把JSON中的双引号(")编码为%22、逗号(,)编码为%2C,破坏了原有JSON的结构,解析时检测到字符串未正常闭合就抛出了对应异常。
2. 当前修复方案的潜在问题
该临时方案可以解决当前版本的兼容问题,但存在以下风险:
- 内容篡改风险:如果JSON字符串本身包含合法的URL编码片段(比如URL参数中自带的
%20、%25等原生编码内容),调用URLDecoder.decode会直接解码这些本应保留的编码内容,改变原始数据的含义,引发后续业务逻辑错误。 - 异常崩溃风险:如果字符串中存在不符合URL编码规范的
%开头字符序列,URLDecoder.decode会直接抛出IllegalArgumentException,导致整个业务流程崩溃。 - 后续兼容性风险:如果后续WebView内核再次调整参数传递逻辑,取消自动编码行为,该修复方案会反过来错误解码正常的JSON字符串,导致解析再次失败。
如果需要更稳妥的兼容方案,建议优先从JS侧调整传递逻辑:将JSON内容做Base64编码后再传递给Native侧,Native侧解码Base64后再解析JSON,可完全规避不同版本WebView的编码兼容问题。
内容的提问来源于stack exchange,提问作者user14272026
相关产品推荐
相关产品推荐

