2012-10-26 38 views
5

शायद यह संभव नहीं है,
लेकिन मैं freemarkerFreemarker JSON के रूप में एक स्ट्रिंग को पार्स

पूर्व के साथ एक नक्शा में json स्ट्रिंग को बदलने के लिए करना चाहते हैं:

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

और प्राप्त कर सकेंगे इस स्ट्रिंग से कुंजी

उत्तर

15

उपयोग ?eval। यह काम करता है क्योंकि जेएसओएन मानचित्र मान्य फ्रीमार्कर अभिव्यक्ति (अद्यतन: null को छोड़कर फ्रीमार्कर 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> 

(BTW, आप \" उपयोग करने के लिए यदि आप ' बजाय " के साथ स्ट्रिंग बोली नहीं है।)

+0

क्या होगा यदि 'test' का शून्य मान है या अपरिभाषित है? –

+0

आपका मतलब है कि यदि' test' t है वह "शून्य" या "अपरिभाषित" स्ट्रिंग? न तो एक वैध एफटीएल अभिव्यक्ति है (हालांकि भविष्य में कभी-कभी 'शून्य' कभी-कभी होगी), इसलिए आपको उन्हें स्पष्ट रूप से जांचना होगा। 'अपरिभाषित' या तो मान्य JSON अभिव्यक्ति नहीं है। मेरा जवाब भी अपडेट किया गया, धन्यवाद। – ddekany

+0

यदि आपके पास आपके जेसन में यूनिकोड है तो यह काम नहीं करेगा। – Ahmed

0

लगता है जैसे आपको JSON को पढ़ने वाले template को परिभाषित/कार्यान्वित करने की आवश्यकता है।

+0

क्या एक आलसी index_of के बारे में और बाध्य '" 'को हटाने: पी –

+0

कर सकते हैं आप मुझे बताएं कि क्या इसे विधि कॉल के साथ किया जा सकता है http://freemarker.org/docs/dgui_template_exp.html#dgui_template_exp_methodcall, पूर्व कॉलिंग के लिए <#assign map = jsponparse (mystring)> –

+0

यह ठीक है यह दस्तावेज़ http: // 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}