我应该如何在JSON中转义字符串?

问题

手动创建JSON数据时,如何转义字符串字段?我应该使用像Apache Commons Lang'sStringEscapeUtilities.escapeHtml,StringEscapeUtilities.escapeXml这样的东西,还是应该使用java.net.URLEncoder

问题是,当我使用SEU.escapeHtml时,它不会转义引号,当我将整个字符串包装在一对'中时,将生成格式错误的JSON。


#1 热门回答(138 赞)

理想情况下,找到一个用你的语言找到一个JSON库,你可以提供一些适当的数据结构,让它担心如何逃避.它会让你更加理智。如果由于某种原因你没有使用你的语言库,你不想使用它(我不建议使用这个),或者你正在编写JSON库,请继续阅读。

根据RFC逃脱它。 JSON相当自由:你唯一的角色是你所拥有的,而且是控制代码(任何小于U 0020的东西)都是981555925,而且是控制代码。

这种转义结构特定于JSON。你需要一个特定于JSON的功能。所有的转义都可以写成\uXXXX其中XXXX是该字符的UTF-16代码单元¹。有一些快捷方式,例如\\,也可以使用。 (它们会产生更小更清晰的输出。)

有关完整的详细信息,请参阅the RFC

¹JSON的转义是基于JS构建的,因此它使用\uXXXX,其中XXXX是UTF-16代码单元。对于BMP之外的代码点,这意味着编码代理对,这可能会有点毛茸茸。 (或者,你可以直接输出字符,因为JSON的编码是Unicode文本,并允许这些特定字符。)


#2 热门回答(49 赞)

摘自FromJettison

public static String quote(String string) {
         if (string == null || string.length() == 0) {
             return "\"\"";
         }

         char         c = 0;
         int          i;
         int          len = string.length();
         StringBuilder sb = new StringBuilder(len + 4);
         String       t;

         sb.append('"');
         for (i = 0; i < len; i += 1) {
             c = string.charAt(i);
             switch (c) {
             case '\\':
             case '"':
                 sb.append('\\');
                 sb.append(c);
                 break;
             case '/':
 //                if (b == '<') {
                     sb.append('\\');
 //                }
                 sb.append(c);
                 break;
             case '\b':
                 sb.append("\\b");
                 break;
             case '\t':
                 sb.append("\\t");
                 break;
             case '\n':
                 sb.append("\\n");
                 break;
             case '\f':
                 sb.append("\\f");
                 break;
             case '\r':
                sb.append("\\r");
                break;
             default:
                 if (c < ' ') {
                     t = "000" + Integer.toHexString(c);
                     sb.append("\\u" + t.substring(t.length() - 4));
                 } else {
                     sb.append(c);
                 }
             }
         }
         sb.append('"');
         return sb.toString();
     }

#3 热门回答(35 赞)

试试这个org.codehaus.jettison.json.JSONObject.quote("your string")

在这里下载:http://mvnrepository.com/artifact/org.codehaus.jettison/jettison