2011-07-25 20 views
8

में मैं जैक्सन का उपयोग JSON ऑब्जेक्ट पैदा करते हैं और उन्हें HTML के टैग में सीधे लिखते हैं, इस तरह के:स्लेश जैक्सन

<script> 
    var data = $SomeJacksonWrapper.toJson($data); 
    </script> 

इस कोड टूट जाता है, तो कुछ स्ट्रिंग उस में '</script>' शामिल हैं। फॉरवर्ड स्लैश (/) से बचने से समस्या हल हो जाएगी और इसे जेएसओएन के स्पेक द्वारा स्वीकार किया जाता है।

मैं इसे जैक्सन में कैसे सक्षम करूं?

+0

आप $ डेटा में से बचने नहीं कर सकते हैं? –

+0

देखें http://stackoverflow.com/questions/5006185/how-to-html-escape-values-by-jackson-generator – bstick12

उत्तर

7

अन्य सुझावों के अलावा, जैक्सन 1.8 में "character escapes" सुविधा भी है, जो बचने वाले नियमों को फिर से परिभाषित करने की अनुमति देती है। दस्तावेज़ीकरण की कमी है, लेकिन मूल रूप से आपको CharacterEscapes को लागू करने की आवश्यकता है (http://jackson.codehaus.org/1.8.2/javadoc/org/codehaus/jackson/io/CharacterEscape देखें), जेसनफ़ैक्टरी (या सीधे जेसन जेनरेटर) के साथ पंजीकरण करें, और फिर भागने से आप जो भी नियम चाहते हैं उसके अनुसार किया जाएगा। इस मामले में आप ESCAPE_STANDARD का उपयोग करने के लिए '/' के लिए सेटिंग बदल सकते हैं।

इसके अतिरिक्त आप सरल ऑन/ऑफ सुविधा जोड़ने के लिए एक सुविधा अनुरोध भी जोड़ सकते हैं, क्योंकि यह विशिष्ट चीज़ ऐसा लगता है जैसे यह दूसरों के लिए भी उपयोगी हो सकता है। लेकिन अभी तक जहां तक ​​मुझे पता है, अभी तक अनुरोध नहीं किया गया है।

+4

अच्छी ब्लॉग एंट्री जैकसन में विशिष्ट वर्णों से बचने के तरीके को समझाते हुए: http: //www.cowtowncoder। कॉम/ब्लॉग/अभिलेखागार/2012/08/entry_476.html – linqu

+0

जैक्सन वास्तव में बेकार है। इस पुस्तकालय में चीजों को इतना जटिल बनाने का एक तरीका है! – Moebius

7

StaxMan ' रों उत्तर का उपयोग करना, मैं निम्नलिखित कोड के साथ समाप्त हुआ:

public class CustomCharacterEscapes extends CharacterEscapes { 

    private static final Logger log = Logger.getLogger(CustomCharacterEscapes.class); 

    private final int[] _asciiEscapes; 

    public CustomCharacterEscapes() { 
     _asciiEscapes = standardAsciiEscapesForJSON(); 
     _asciiEscapes['/'] = CharacterEscapes.ESCAPE_STANDARD; 
    } 

    @Override 
    public int[] getEscapeCodesForAscii() { 
     return _asciiEscapes; 
    } 

    @Override 
    public SerializableString getEscapeSequence(int i) { 
     return null; 
    } 
    } 


    public class CustomObjectMapper extends ObjectMapper { 

    public CustomObjectMapper() { 
     this.getJsonFactory().setCharacterEscapes(new CustomCharacterEscapes()); 
    } 

    } 
6

StaxMan के लिए धन्यवाद और Infeligo के जवाब यहां (चियर्स लोग) मैं के लिए भागने/मिलान करने के लिए प्रदान करने के लिए एक रास्ता मिल गया (IMHO भयानक) WCF DataContractJsonSerializer तारीख मानक प्रारूप:

/Date(1328053610008+1100)/ 

जो की आवश्यकता है/एक बैकस्लैश तार भर में निम्नलिखित में जिसके परिणामस्वरूप के साथ भाग जाना चाहिए:

\/Date(1328053610008+1100)\/ 

बस के मामले में यह मदद मिल सकती है यहाँ कोई और मेरे CustomCharacterEscapes कोड है कि मैं प्रयोग किया जाता है:

public class CustomCharacterEscapes extends CharacterEscapes { 

    private final int[] _asciiEscapes; 

    public CustomCharacterEscapes() { 
     _asciiEscapes = standardAsciiEscapesForJSON(); 
     _asciiEscapes['/'] = CharacterEscapes.ESCAPE_CUSTOM; 
    } 

    @Override 
    public int[] getEscapeCodesForAscii() { 
     return _asciiEscapes; 
    } 

    @Override 
    public SerializableString getEscapeSequence(int i) { 
     if(i == '/'){ 
      return new SerializableString() { 

       @Override 
       public String getValue() { 
        return "\\/"; 
       } 

       @Override 
       public int charLength() { 
        return 2; 
       } 

       @Override 
       public char[] asQuotedChars() { 
        return new char[]{'\\','/'}; 
       } 

       @Override 
       public byte[] asUnquotedUTF8() { 
        return new byte[]{'\\','/'}; 
       } 

       @Override 
       public byte[] asQuotedUTF8() { 
        return new byte[]{'\\','/'}; 
       } 
      }; 
     } 
     else{ 
      return null; 
     } 
    } 
} 
+0

इससे मदद मिली। धन्यवाद! – dmon

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