从 String 解析到 Map 时出现 JsonParseException

Posted

技术标签:

【中文标题】从 String 解析到 Map 时出现 JsonParseException【英文标题】:JsonParseException while parsing from String to Map 【发布时间】:2011-05-22 22:45:26 【问题描述】:

我已经像这样完成了 Map 对象到字符串对象的转换

    public String getJsonString(Map<String, Map<String,List<CalculateContentCount>>> countMap) 
    Gson gson = new Gson();
    String jsonString = gson.toJson(countMap);
    return jsonString;

在 ftl 中,我将返回的 String 对象设置为 request 并将其粘贴到 JSP 文件中

   <#assign countMap = json>
   <form action="/alfresco/jsp/kpub/reports/exportContentCountList.jsp" method="get">

<input type="hidden" name="countMap" id="countMap" value="$countMap">
<input type="submit" value="ExportFiletoCSV"/>
   </form>

在 exportContentCountList 中,我尝试将字符串对象解析回 Map 对象,

String jsonString = request.getParameter("countMap");
System.out.println("jsonString : "+jsonString);
Gson gson = new Gson();
Map<String,Map<String,List<CalculateContentCount>>> countMap = null;
Type type = null;
if(jsonString != null && !"".equals(jsonString)) 
    type = new TypeToken<Map<String,Map<String,List<CalculateKpubContentCount>>>>().getType();
    countMap = gson.fromJson(jsonString,type);

在执行时,出现以下异常。这是例外

com.google.gson.JsonParseException: Failed parsing JSON source:        
caused by:
com.google.gson.ParseException: Encountered "<EOF>" at line 1, column 1. 
Was expecting one of: 
<IDENTIFIER_SANS_EXPONENT> ... 
<IDENTIFIER_STARTS_WITH_EXPONENT> ... 
<SINGLE_QUOTE_LITERAL> ... 
<DOUBLE_QUOTE_LITERAL> ... 
"" ... 

可能是什么问题?

【问题讨论】:

【参考方案1】:

检查生成的 html 输出。在网络浏览器中右键单击页面并选择查看源代码。看起来对吗?还有双引号? Gson 输出带双引号的 JSON 字符串。换句话说,生成的 HTML 在语法上是无效的。

使用 JSTL fn:escapeXml() 转义 HTML 特殊字符,例如 &lt;&gt;"',这样它们就不会破坏 HTML 语法。

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<input type="hidden" name="countMap" id="countMap" value="$fn:escapeXml(countMap)">

这样,整个字符串将被传回,而不是只传递一部分直到第一个引号(这导致 Gson 检测到 EOF(文件结束,或者更好地被解释为字符串结束)。


更新

如果不能使用 JSTL,则必须使用 String#replace() 手动转义 HTML 实体。例如

return jsonString.replace("\"", "&quot;");

【讨论】:

谢谢。实际上我使用的是不支持标签库的 FTL。所以我不能使用上面的。所以我传递了值 lik value=$countMap,没有引号,现在它部分解析并显示另一个错误, 输出:jsonString:"12/06/2010":"kpubType":["count":0,"contentName":"Sanple"],"12/07/ 2010":"topic":["count":0,"contentName":"示例 出现此错误后,“com.google.gson.ParseException: Encountered "\"" at line 1, column 113."

以上是关于从 String 解析到 Map 时出现 JsonParseException的主要内容,如果未能解决你的问题,请参考以下文章

解析“......没有方法'replace'”时出现JSON错误

解析 JSON 时出现 AFError Alamofire 5

从推送通知解析时出现 SwiftyJson 解析问题

尝试从 sharedPreferences 检索地图时出现颤振错误

将大型 JSON (InputStream) 放入 String 时出现内存不足错误

从“aws ec2 describe-instances”输出解析 json 时出现问题