JsonParseException при разборе строки на карту - PullRequest
1 голос
/ 09 декабря 2010

Я сделал преобразование объекта Map в строковый объект, как это

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

В ftl я установил возвращенный объект String в запрос и поместил его в файл 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 Ответ

1 голос
/ 10 декабря 2010

Проверьте сгенерированный вывод HTML.Щелкните правой кнопкой мыши страницу в веб-браузере и выберите Просмотр источника .Это выглядит правильно?Также двойные кавычки?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 (конец файла), или лучше интерпретировать какEnd Of String).


Обновление :

Если вы не можете использовать JSTL, вы должны использовать String#replace() для выхода из сущностей HTML вручную. Например,

return jsonString.replace("\"", "&quot;");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...