2012-10-26 7 views
5

おそらくそれは
、ことはできませんが、私はFreeMarkerのFreemarkerのは、JSONとして文字列を解析

元にマップにJSON文字列を変換したい:

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

を得ることができますテキストこの文字列のキー

答えて

15

使用?eval。これは、JSONマップが有効なFreeMarker式(update:nullがFreeMarker 2.3.xでは認識されない点を除いて)のために動作します。

<#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> 

(ところで、あなたは'の代わり"で文字列を引用する場合\"を使用する必要はありません。)

+0

'test'がヌル値を持っているのか、それとも未定義なのですか? –

+0

' test'がt彼は文字列 "ヌル"または "未定義"ですか?有効なFTL式もありません(ただし、将来は「null」となります)ので、明示的にチェックする必要があります。 'undefined'は有効なJSON式でもありません。また、私の答え、感謝を更新しました。 – ddekany

+0

jsonにUNICODEがある場合、これは動作しません。 – Ahmed

0

JSONを読み取るtemplateを定義/実装する必要があるようです。コード内

+0

何怠惰index_of程度と '" 'バインドを削除する:P –

+0

をすることができます<#assign map = jsponparse(mystring)> –

+0

を呼び出す前に、このドキュメントhttp://を参照して、メソッドコールhttp://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_methodcallで実行できるかどうか教えてください。 freemarker.sourceforge.net/docs/pgui_datamodel_method.htmlもっと便利な –

4

freemarker.sourceforge.net/docs/pgui_datamodel_method.html

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

テンプレートで:

<#assign map = JsonParser("{\"foo\":\"bar\", \"f\":4, \"text\":\"bla bla\"}")> 
${map.text} 
関連する問題