2013-02-23 38 views
9

我剛剛開始使用傑克遜,因爲它與Spring框架集成,並且遇到了單引號引起的問題。當試圖在頁面上用jQuery解析JSON時,我得到一個JavaScript錯誤"SyntaxError: missing) after argument list"。我習慣於使用Gson來序列化我的對象,並且不會遇到這個問題,因爲Gson會用Unicode \ u0027替換單引號。傑克遜序列化不能正確處理單引號

例如;
的Java

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"}}]

的JavaScript;
// This is where the JavaScript fails with the Jackson serialized object
$.parseJSON('${requestScope.person}');

我找了一個解決方案,但無法找到一個。 有誰知道是否可以配置傑克遜像Gson一樣處理單引號?

謝謝你的時間。

+2

不要嘗試在字符串文本中輸出JSON(當然是轉義它們)並解析它們。只輸出對象文字! – Bergi 2013-02-23 17:27:09

+0

對不起,我忘記了這不是ajax調用,而是在JSP上解析JSON對象。如果這是一個直接的Ajax調用,那就不會有問題了。 – Jason 2013-02-23 23:44:10

+0

不,你正試圖用JavaScript解析一個(錯誤轉義的)JSON字符串(不是JSP) – Bergi 2013-02-23 23:45:41

回答

5

另一個答案顯示了一種方法來做到這一點,它應該工作得很好。

但還有另一種方式做到這一點爲好,這是少一點工作,在「Forcing escaping of HTML characters in JSON using Jackson

+0

這就是我一直在尋找。謝謝!我只是希望有一種方法可以在Jackson2ObjectMapperFactoryBean類中註冊Spring中的自定義CharacterEscapes。 – Jason 2013-02-25 19:42:29

+0

可能值得向Spring開發團隊建議? – StaxMan 2013-02-25 22:42:55

2

要解決此問題,我最終爲Jackson創建了一個自定義String序列化程序。我借用了Gson的一些資料。

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

這很有趣:你從客戶端解釋了評論,我從服務器端解釋它。我以爲@Bergi正在說要將對象傳入Jackson,以便它不會在字符串中轉義引號。 – ingyhere 2014-06-26 19:07:34