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

Lam*_*bda 149 java json escaping

手动创建JSON数据时,如何转义字符串字段?我应该使用类似的Apache Commons Lang中的StringEscapeUtilities.escapeHtml,StringEscapeUtilities.escapeXml或者我应该使用java.net.URLEncoder

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

Tha*_*tos 152

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

根据RFC逃脱它.JSON是相当宽松:你唯一的字符必须逃脱的\,"和(不是U + 0020少任何东西)控制代码.

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

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

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

  • 只有双引号(```). (14认同)
  • @Sergei:字符`{[]}:?`不能使用单个反斜杠进行转义.(例如,``:`在JSON字符串中无效.)所有这些都可以选择使用`\ uXXXX`语法进行转义,浪费了几个字节.请参阅RFC的§2.5. (3认同)
  • 我不确定它支持的范围有多广,但根据我的经验,调用`JSON.stringify()`完成了这项工作. (2认同)
  • @BitTickler unicode字符一点都不模糊-只是表示它在unicode规范中具有一个或多个代码点。当您使用std :: string时,它是一堆unicode字符。当您需要对其进行序列化时,可以说一个文件或跨网络,这就是“编码”的来源。根据Thanatos的说法,他们希望您使用UTF,但是从技术上讲,只要可以使用任何编码,可以将其重构为unicode字符。 (2认同)

Mon*_*ded 53

Jettison中提取:

 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();
     }
Run Code Online (Sandbox Code Playgroud)

  • 好吧,这是OP标签 (10认同)

dpe*_*uha 36

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

在此处下载:http://mvnrepository.com/artifact/org.codehaus.jettison/jettison

  • org.json.JSONObject.quote(“您的json字符串”)也可以正常工作 (2认同)

Dan*_*Dev 23

org.json.simple.JSONObject.escape()转义引号,\,/,\ r,\n,\ b,\ f,\ t和其他控制字符.它可用于转义JavaScript代码.

import org.json.simple.JSONObject;
String test =  JSONObject.escape("your string");
Run Code Online (Sandbox Code Playgroud)

  • 它取决于你正在使用的json库(JSONObject.escape,JSONObject.quote,..)但它总是一个静态的方法来做引用工作,只是应该重用 (3认同)

NS *_*oit 21

Apache commons lang现在支持这一点.只需确保您的类路径上有最新版本的Apache commons.你需要3.2+版本

版本3.2的发行说明

LANG-797:将escape/unescapeJson添加到StringEscapeUtils.

  • 这在 apache commons lang 中已弃用,您需要使用 apache commons **text**。遗憾的是,这个库通过转义 `/` 字符来遵循可选/过时的规范。这破坏了很多东西,包括带有 URL 的 JSON。最初的提案将 `/` 作为一个特殊的字符来转义,但现在已经不是这样了,正如我们在[撰写本文时的最新规范](http://www.ecma-international.org/ecma- 262/8.0/index.html) (2认同)

I.G*_*ual 10

org.json.JSONObject quote(String data) 方法完成这项工作

import org.json.JSONObject;
String jsonEncodedString = JSONObject.quote(data);
Run Code Online (Sandbox Code Playgroud)

摘自文档:

将数据编码为JSON字符串.这适用于引号和任何必要的字符转义.[...] Null将被解释为空字符串


小智 6

StringEscapeUtils.escapeJavaScript/也StringEscapeUtils.escapeEcmaScript应该做的伎俩.

  • `escapeJavaScript`将单引号转义为`\'`,这是不正确的. (9认同)

Dhi*_*raj 6

如果您使用的是 fastexml jackson,则可以使用以下内容: com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)

如果您使用的是 codehaus jackson,则可以使用以下内容: org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)