1

私はこのようにオブジェクトを文字列オブジェクトに変換しました

    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> ... 
"}" ... 

何が問題なのですか?

4

1 に答える 1

1

生成されたHTML出力を確認します。Webブラウザでページを右クリックし、[ソースの表示]を選択します。正しく見えますか?また、二重引用符?Gsonは二重引用符でJSON文字列を出力します。つまり、生成されたHTMLは構文的に無効です。

JSTLfn: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 File、またはEnd Of Stringとして解釈される方がよい)を検出しました。


更新

JSTLを使用できない場合は、を使用String#replace()してHTMLエンティティを手動でエスケープする必要があります。例えば

return jsonString.replace("\"", "&quot;");
于 2010-12-10T02:25:51.813 に答える