2012-10-26 12 views
5

Wahrscheinlich ist es nicht möglich,
aber ich möchte einen JSON-String in einer Karte verwandeln mit FreemarkerFreemarker parsen einen String als Json

ex:

<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}"> 

und der Lage sein, die zu bekommen Text Schlüssel aus dieser Zeichenfolge

Antwort

15

Verwendung ?eval. Es funktioniert, weil JSON-Maps gültige FreeMarker-Ausdrücke sind (update: außer dass null in FreeMarker 2.3.x nicht erkannt wird).

<#assign test = "{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}"> 
<#assign m = test?eval> 

${m.foo} <#-- prints: bar --> 

<#-- Dump the whole map: --> 
<#list m?keys as k> 
    ${k} => ${m[k]} 
</#list> 

(BTW, Sie haben nicht \" zu verwenden, wenn Sie die Zeichenfolge mit ' statt " zitieren.)

+0

Was ist, wenn 'test' einen Nullwert hat? oder undefiniert? –

+0

Sie meinen was, wenn' test' t ist er string "null" oder "undefiniert"? Weder ist ein gültiger FTL-Ausdruck (obwohl "Null" manchmal in der Zukunft liegt), also müssen Sie explizit nach ihnen suchen. 'undefined' ist auch kein gültiger JSON-Ausdruck. Auch aktualisiert meine Antwort, danke. – ddekany

+0

Dies wird nicht funktionieren, wenn Sie UNICODE in Ihrem json haben. – Ahmed

0

Klingt wie Sie müssen definieren/implementieren template, die JSON liest.

+0

was über einen faulen index_of und das gebundene Entfernen '" ': P –

+0

Können Sie Sag mir, ob es mit einem Methodenaufruf gemacht werden kann http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_methodcall, zum ex calling <#assign map = jsponparse (mystring)> –

+0

es ist ok dieses doc gefunden http: // freemarker.sourceforge.net/docs/pgui_datamodel_method.html mehr nützlich –

4

freemarker.sourceforge.net/docs/pgui_datamodel_method.html

in Code:

// a class to parse Json, just add this method to your rendered template data 
// with data.put("JsonParser", new FreemarkerJsonParser()); 
// or in shared variables http://freemarker.sourceforge.net/docs/pgui_config_sharedvariables.html 
public class FreemarkerJsonParser implements TemplateMethodModel{ 
    @Override 
    public Object exec(List args) throws TemplateModelException { 
     return new Gson().fromJson(s, new TypeToken<Map<String, String>>() {}.getType());((String) args.get(0)); 
    } 
} 

in der Vorlage:

<#assign map = JsonParser("{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}")> 
${map.text}