2013-02-23 34 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