2010-12-09 6 views
1

Je l'ai fait l'objet Carte à la conversion d'objets de chaîne comme ceJsonParseException lors de l'analyse de la chaîne à Carte

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

En FTL je mets l'objet String retourné en demande et PASED dans le fichier 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> 

en exportContentCountList, j'ai essayé d'analyser l'objet chaîne de retour à la carte objet,

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

Lors de l'exécution, une exception suivante se produit. Voici l'exception

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

Quel est le problème?

Répondre

1

Vérifiez la sortie HTML générée. Cliquez sur le bouton droit de la souris dans webbrowser et choisissez Voir Source. Est-ce que ça a l'air juste? Aussi les doubles quotes? Gson génère des chaînes JSON avec des guillemets doubles. En d'autres termes, le code HTML généré est syntaxiquement invalide.

Utilisez JSTL fn:escapeXml() pour échapper HTML caractères spéciaux comme <, >, ", ' afin qu'ils ne malform la syntaxe HTML.

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

De cette façon, la chaîne entière sera repassée au lieu de seulement une partie jusqu'à ce que la première citation (qui a causé Gson pour détecter un EOF (fin du fichier, ou mieux être interprété comme la fin de chaîne).


Mise à jour.

Si vous ne pouvez pas utiliser JSTL, vous devez utiliser String#replace() pour échapper à des entités HTML manuellement Par exemple,

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

Merci. En fait, j'utilise FTL qui ne supporte pas les bibliothèques de balises. Donc je ne peux pas utiliser ce qui précède. donc j'ai passé la valeur lik value = $ {countMap}, sans guillemets, maintenant il analyse partiellement et me montre une autre erreur, – i2ijeya

+0

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

+0

Après que cette erreur se produit, "com" .google.gson.ParseException: "\" "rencontré à la ligne 1, colonne 113." – i2ijeya

Questions connexes