从String解析为Map时出现JsonParseException

时间:2010-12-09 15:36:28

标签: java json jsp freemarker gson

我已经将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 个答案:

答案 0 :(得分:1)

检查生成的HTML输出。右键单击webbrowser中的页面,然后选择查看源。看起来不错吗?还有双引号? Gson输出带双引号的JSON字符串。换句话说,生成的HTML在语法上是无效的。

使用JSTL fn:escapeXml()来转义HTML特殊字符,例如<>"',这样它们就不会违反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实体。 E.g。

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