2010-12-09 5 views
1

I Map-Objekt zu String-Objekt Konvertierung wie dieseJsonParseException während von String-Parsing auf Karte

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

In FTL-Set in Anforderung zurückgegebenen String-Objekt Ich habe und pased es in die Datei 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> 
getan haben

In exportContentCountList habe ich versucht, das String-Objekt zu analysieren zurück Objekt auf der Karte,

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); 
} 

Während der Ausführung tritt die folgende Ausnahme auf. Hier ist die Ausnahme

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

Was kann das Problem sein?

Antwort

1

Überprüfen Sie die generierte HTML-Ausgabe. Klicken Sie mit der rechten Maustaste auf die Seite im Webbrowser und wählen Sie Quelle anzeigen. Sieht es richtig aus? Auch die Anführungszeichen? Gson gibt JSON-Zeichenfolgen mit doppelten Anführungszeichen aus. Mit anderen Worten, das generierte HTML ist syntaktisch ungültig.

Verwenden JSTL fn:escapeXml() zu entkommen HTML-Sonderzeichen wie <, >, ", ' so dass sie nicht die HTML-Syntax malform werden.

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

diese Weise wird die gesamte Zeichenfolge wird, bis das erste Zitat zurück, anstatt nur einen Teil weitergegeben werden (die verursacht Gson ein EOF (End Of File zu erkennen oder besser als End Of String interpretiert werden.)


aktualisieren.

Wenn Sie nicht JSTL verwenden können, müssen Sie String#replace() verwenden, um manuell HTML-Entitäten zu entkommen Eg

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

Danke. Eigentlich verwende ich FTL, das keine Tag-Bibliotheken unterstützt. Also kann ich das obengenannte nicht verwenden. Also habe ich den Wert lik Wert = $ {countMap}, ohne Anführungszeichen übergeben, jetzt wird es teilweise analysiert und zeigt mir einen anderen Fehler, – i2ijeya

+0

Ausgabe: jsonString: {"12/06/2010": {"kpubType": [{"count ": 0," contentName ":" Sanple "}]}," 12/07/2010 ": {" topic ": [{" count ": 0," contentName ":" Beispiel – i2ijeya

+0

Nachdem dieser Fehler auftritt, "com .google.gson.ParseException: In Zeile 1, Spalte 113, wurde "\" gefunden. " – i2ijeya