2011-06-17 14 views
17

में जेसन स्ट्रिंग से कैसे बचें हम स्प्रिंग एमवीसी और फ्रीमार्कर का उपयोग टेम्पलेटिंग भाषा के रूप में एक आरामदायक एपीआई बना रहे हैं। हम freemarker में json प्रतिक्रियाओं का निर्माण करने के लिए चुना हैफ्रीमार्कर

उदाहरण freemarker.ftl:

{ 
"field1" : "${response.value1}", 
"field2" : "${response.value2}" 
} 

हम एक समस्या मिलती है, जब मूल्यों में तार उद्धरण चिह्न (या अन्य वर्णों के किसी भी JSON वाक्य रचना में शामिल)।

प्रश्न: मैं फ्रीमार्कर का उपयोग करके इन तारों से कैसे बच सकता हूं?

हम ?xml या ?html पर ध्यान दिया है, लेकिन वे (जैसे \ के रूप में) सभी प्रासंगिक पात्रों को कवर नहीं है।

संपादित करें:?js_string जावास्क्रिप्ट के साथ काम करने के लिए स्ट्रिंग से बच जाएगा। और चूंकि JSON जावास्क्रिप्ट (जावास्क्रिप्ट ऑब्जेक्ट नोटेशन) पर आधारित है, यह काम करेगा।

EDIT2: यदि एकल-कोट पॉप अप हो जाता है, तो ?js_script इससे बच जाएगा जो फिर से अमान्य JSON की ओर जाता है। इसके लिए हॉटफिक्स है:

${variable?js_string?replace("\\'", "\'")} 

और तुम सच में चुनने की करना चाहते हैं: वैकल्पिक रूप से

${variable?js_string?replace("\\'", "\'")?replace("\\>",">")} 

यदि आप वसंत का उपयोग करें: http://www.springsurf.org/sites/1.0.0.M3/spring-webscripts/spring-webscripts-documentation/reference/html-single/index.html#js-api-index-org.springframework.extensions.webscripts.json.jsonutils

+0

स्प्रिंग विकल्प –

उत्तर

23

आप ?js_string ऑपरेटर के लिए देख रहे हैं।

{ 
"field1" : "${response.value1?js_string}", 
"field2" : "${response.value2?js_string}" 
} 

यह उद्धरण, बैकस्लाश, आदि से बचने का ख्याल रखेगा। अपने जेएस को खुश करने के लिए अल।

संपादित करें: मैंने अभी देखा है कि उन्होंने फ्रीमार्कर 2.3.1 9 में ?json_string ऑपरेटर पेश किया था। here देखें कि यह वास्तव में कैसे काम करता है। और वहाँ बहुत आनन्द था ...

+0

के लिए +1 क्या लाभ के लिए अधिक js_string इस मामले में j_string?? – Skurpi

+0

@Skurpi लाभ यह है कि 'js_string' आवश्यक escaping करता है जबकि 'j_string' नहीं करता है। – Waldheinz

+0

@ वाल्डहेन्ज़ और @stevevls धन्यवाद! – Skurpi

2

ऊपर जवाब के सभी गठबंधन करने के लिए एक FreeMarker macro का प्रयोग करें, जबकि टेम्पलेट अधिक पठनीय और पोषणीय बनाने:

<#macro json_string string>${string?js_string?replace("\\'", "\'")?replace("\\>", ">")}</#macro> 
{ 
"field1" : "<@json_string "${response.value1}"/>", 
"field2" : "<@json_string "${response.value2}"/>" 
} 

आप एक से अधिक टेम्पलेट में मैक्रो का पुन: उपयोग करना चाहते हैं, मैक्रो डुप्लिकेट करने के बजाय अपने स्वयं के फ़ाइल और include the file में रख:

<#include "/path/to/macro.ftl"> 
+0

यह वास्तव में हमने किया है, लेकिन हमने इसमें कुछ अतिरिक्त कार्यक्षमता डाली है जिसका हमने उपयोग किया था: <#macro hazString सामग्री सामग्री> \t <#if सामग्री? Has_content && content! = ""> "$ {Content? Js_string प्रतिस्थापित करें ("\\ '", "\" ")? प्रतिस्थापित करें (" \\> ","> ")}" <#else> शून्य Skurpi

संबंधित मुद्दे