2013-02-23 50 views
9

मैंने स्प्रिंग फ्रेमवर्क के साथ एकीकरण के कारण जैक्सन का उपयोग करना शुरू कर दिया है और एक मूल्य में सिंगल कोट्स के साथ एक समस्या में भाग लिया है। पृष्ठ पर jQuery के साथ JSON को पार्स करने का प्रयास करते समय, मुझे एक जावास्क्रिप्ट त्रुटि "SyntaxError: missing) after argument list" मिलती है। मैं अपनी वस्तुओं को क्रमबद्ध करने के लिए जीसन का उपयोग करने के लिए प्रयोग किया जाता हूं और इस मुद्दे में भाग नहीं लेता क्योंकि जीसन यूनिकोड \ u0027 के साथ एकल उद्धरण को प्रतिस्थापित करेगा।जैक्सन सीरियलाइजेशन एकल कोट को ठीक से संभाल नहीं रहा

उदाहरण के लिए;
जावा

public final class Person { 
    private String firstName; 
    private String lastName; 

    public Person() {} 

    public void setFirstName(String firstName) { 
    this.firstName = firstName; 
    } 

    public String getFirstName() { 
    return firstName; 
    } 

    public void setLastName(String lastName) { 
    this.lastName = lastName; 
    } 

    public String getLastName() { 
    return lastName; 
    } 
} 


JSON
जैक्सन में [{"person":{"firstName":"James","lastName":"O'tool"}}]
Gson [{"person":{"firstName":"James","lastName":"O\u0027tool"}}]

जावास्क्रिप्ट में;
// This is where the JavaScript fails with the Jackson serialized object
$.parseJSON('${requestScope.person}');

मैंने एक समाधान की तलाश की है, लेकिन मैं एक खोजने में असमर्थ हूं। क्या किसी को पता है कि जैक्सन को सिंगल कोट्स को संभालने के लिए जैक्सन को कॉन्फ़िगर करना संभव है या नहीं?

आपके समय के लिए धन्यवाद।

+2

स्ट्रिंग अक्षर में जेएसओएन आउटपुट करने की कोशिश न करें (निश्चित रूप से उनसे बचें) और उन्हें पार्स करें। बस ऑब्जेक्ट लिटरेल्स आउटपुट! – Bergi

+0

क्षमा करें, मैं यह शामिल करना भूल गया कि यह अजाक्स कॉल नहीं है और JSON ऑब्जेक्ट का पार्सिंग जेएसपी पर होता है। अगर यह एक सीधा अप AJAX कॉल था, तो कोई मुद्दा नहीं होगा। – Jason

+0

नहीं, आप जावास्क्रिप्ट (जेएसपी नहीं) – Bergi

उत्तर

5

दूसरा उत्तर ऐसा करने का एक तरीका दिखाता है, और इसे बहुत अच्छी तरह से काम करना चाहिए।

लेकिन इस के रूप में अच्छी तरह से करने के लिए एक और तरीका है, थोड़ा कम काम है जो है, पर "Forcing escaping of HTML characters in JSON using Jackson"

+0

यही वह है जिसे मैं ढूंढ रहा था। धन्यवाद! मेरी इच्छा है कि जैक्सन 2 ऑब्जेक्टमैपर फैक्ट्रीबीन क्लास के साथ स्प्रिंग में कस्टम कैरेक्टरएस्केप पंजीकृत करने का एक तरीका था। – Jason

+0

स्प्रिंग देव टीम को सुझाव देने लायक हो सकता है? – StaxMan

2

इस समस्या को हल करने के लिए, मैंने जैक्सन के लिए एक कस्टम स्ट्रिंग धारावाहिक बनाने का अंत किया। मैंने जीसन से कुछ स्रोत उधार लिया।

public class HtmlStringSerializer extends StdSerializer<String> { 
     protected HtmlStringSerializer() { super(String.class); } 

     private static final String[] HTML_SAFE_REPLACEMENT_CHARS; 
     static { 
     HTML_SAFE_REPLACEMENT_CHARS = new String[128]; 
     for (int i = 0; i <= 0x1f; i++) { 
      HTML_SAFE_REPLACEMENT_CHARS[i] = String.format("\\u%04x", i); 
     } 
     HTML_SAFE_REPLACEMENT_CHARS['"'] = "\\\""; 
     HTML_SAFE_REPLACEMENT_CHARS['\\'] = "\\\\"; 
     HTML_SAFE_REPLACEMENT_CHARS['\t'] = "\\t"; 
     HTML_SAFE_REPLACEMENT_CHARS['\b'] = "\\b"; 
     HTML_SAFE_REPLACEMENT_CHARS['\n'] = "\\n"; 
     HTML_SAFE_REPLACEMENT_CHARS['\r'] = "\\r"; 
     HTML_SAFE_REPLACEMENT_CHARS['\f'] = "\\f"; 
     HTML_SAFE_REPLACEMENT_CHARS['<'] = "\\u003c"; 
     HTML_SAFE_REPLACEMENT_CHARS['>'] = "\\u003e"; 
     HTML_SAFE_REPLACEMENT_CHARS['&'] = "\\u0026"; 
     HTML_SAFE_REPLACEMENT_CHARS['='] = "\\u003d"; 
     HTML_SAFE_REPLACEMENT_CHARS['\''] = "\\u0027"; 
     } 

     @Override 
     public void serialize(String string, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     int last = 0; 
     int length = string.length(); 
     StringBuilder sb = new StringBuilder(length); 

     for (int i = 0; i < length; i++) { 
      char c = string.charAt(i); 
      String replacement; 
      if (c < 128) { 
      replacement = HTML_SAFE_REPLACEMENT_CHARS[c]; 
      if (replacement == null) { continue; } 
      } else if (c == '\u2028') { 
      replacement = "\\u2028"; 
      } else if (c == '\u2029') { 
      replacement = "\\u2029"; 
      } else { 
      continue; 
      } 
      if (last < i) { 
     sb.append(string.substring(last, i)); 
      } 
      sb.append(replacement); 
      last = i + 1; 
     } 
     if (last < length) { 
      sb.append(string.substring(last)); 
     } 
     gen.writeString(sb.toString()); 
     } 
    } 
0

@Bergi करने की कोशिश कर रहा था समझाया कहते हैं: का उपयोग नहीं करते:

$.parseJSON('${requestScope.person}') 

बस

${requestScope.person} 

सीधे उपयोग करें!

+0

यह मजाकिया है: आपने क्लाइंट साइड से टिप्पणी की व्याख्या की, और मैंने इसे सर्वर की तरफ से व्याख्या की। मैंने सोचा कि @ बर्गि जैक्सन में ऑब्जेक्ट्स पास करने के लिए कह रही थी ताकि वह स्ट्रिंग में उद्धरण वर्णों से बच न सके। – ingyhere