You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSON值含未转义双引号,无法通过Gson转换为Java对象求助

解决含未转义双引号的JSON转Java对象问题

我太懂你遇到的这个糟心问题了!你的核心麻烦在于手里的JSON本身是无效的——password字段值里的双引号没有转义,直接违反了JSON的语法规则,这才导致Gson根本没法正常解析它。

先看问题根源

你给出的JSON示例里:

{ "credentials": { "password": "Password"123", "emailAddress": "skylineadmin@gmail.com" }, "clientTimeMs": 1582006455421, "callerRole": 0 }

"Password"123" 里的第二个双引号没有被转义,正确的合法JSON写法应该是把这个双引号改成\",也就是:

{ "credentials": { "password": "Password\"123", "emailAddress": "skylineadmin@gmail.com" }, "clientTimeMs": 1582006455421, "callerRole": 0 }

解决方案分两种情况

1. 能控制JSON的生成端(优先选这个!)

如果这个JSON是你自己的服务或程序生成的,那最根本的解决办法是让生成JSON的逻辑正确转义特殊字符(双引号、反斜杠、换行符这些)。不管是用JSON库自动生成还是手动拼接,都要严格遵循JSON语法规范,这样生成的合法JSON交给Gson就能直接解析,不会出任何问题。

2. 没法修改输入的JSON,只能手动修复

如果JSON是第三方提供的、你没法改动源头,那只能先修复这个无效的JSON再解析。可以用正则表达式处理值里未转义的双引号(注意要避开字段名的双引号,避免误改):

String invalidJson = "{ \"credentials\": { \"password\": \"Password\"123\", \"emailAddress\": \"skylineadmin@gmail.com\" }, \"clientTimeMs\": 1582006455421, \"callerRole\": 0 }";
// 替换值中未转义的双引号,避开字段名的引号边界
String fixedJson = invalidJson.replaceAll("(?<!\\\\)\"(?!:|,|\\}|\\{)", "\\\\\"");

// 然后用Gson解析,注意这里要传.class,不是.java!
Gson gson = new Gson();
PasswordResetDetails details = gson.fromJson(fixedJson, PasswordResetDetails.class);

⚠️ 注意:这种正则方案是临时救急的,边缘场景可能会出错(比如值里刚好有,:这些字符的情况),如果能从源头修复JSON合法性才是长久之计。

另外还要提一句:你原来的Gson代码里写了PasswordResetDetails.java,这是错误的,应该传PasswordResetDetails.class,这个小细节可别忽略哦!

内容的提问来源于stack exchange,提问作者user2978615

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:47:28