【问题标题】:Java escape JSON String?Java转义JSON字符串?
【发布时间】:2013-09-24 18:42:30
【问题描述】:

我将以下 JSON 字符串发送到 NodeJS 服务器:

String string = "{\"id\":\"" + userID + "\",\"type\":\"" + methoden + "\",\"msg\":\"" + msget + "\", \"name\":\"" + namnet + "\", \"channel\":\"" + activeChatChannel + "\", \"visitorNick\":\"\", \"agentID\":\" " + agentID + "\"}";

PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "utf-8"));
pw.println(string);

当字符串msget包含字符"'时问题就出现了

在 NodeJS 服务器上,我像这样解析 JSON:

var obj = JSON.parse(message);

有什么办法可以毫无问题地发送所有字符吗?

【问题讨论】:

标签: java json node.js


【解决方案1】:

尝试用 \ 替换所有的 " 和 '。这样做只是为了 msget 对象(我猜是字符串)。不要忘记 \ 也必须被转义。

【讨论】:

    【解决方案2】:

    根据答案here,值中的引号需要转义。你可以用\"来做到这一点

    所以只需在你的价值观中替换引号

    msget = msget.replace("\"", "\\\"");
    

    【讨论】:

      【解决方案3】:

      最好的方法是使用一些 JSON 库,例如杰克逊 (http://jackson.codehaus.org)。

      但如果这不是一个选项,只需在将 msget 添加到您的字符串之前将其转义即可:

      这样做的错误方法是

      String msgetEscaped = msget.replaceAll("\"", "\\\"");
      

      任一种使用(在 cmets 中推荐)

      String msgetEscaped = msget.replace("\"", "\\\"");
      

      String msgetEscaped = msget.replaceAll("\"", "\\\\\"");
      

      可以在此处找到包含所有三个变体的示例:http://ideone.com/Nt1XzO

      【讨论】:

      • 我没有投反对票,但replaceAll() 不起作用。您需要使用replace
      • 您是否尝试过您发布的代码?它没有效果。您可以使用replace(...)replaceAll("\"", "\\\\\""),因为反斜杠在替换字符串中也有特殊含义。请参阅 javadoc。
      • 如果我应该删除这个答案,因为它是错误的,或者我应该让它保持原样,因为它显示了如何不这样做,我会有偏见?
      • @DirkLachowski:如果我是你,我会删除它(当我感到懒惰时)或修复它。
      • @jlordo:恐怕你错了。 replace() 和 replaceAll() 之间的区别在于前者的第一个 arg 是文字字符串,而后者是正则表达式。替换不是正则表达式(但可以在后面包含一些特殊字符)。所以 replaceAll() 将按照我发布的方式工作 - 是的,我现在已经尝试过了。
      【解决方案4】:

      我会使用一个库为您创建 JSON String。一些选项是:

      这将使处理转义变得更加容易。一个例子(使用org.json)是:

      JSONObject obj = new JSONObject();
      
      obj.put("id", userID);
      obj.put("type", methoden);
      obj.put("msg", msget);
      
      // etc.
      
      final String json = obj.toString(); // <-- JSON string
      

      【讨论】:

        【解决方案5】:

        org.json.simple.JSONObject.escape() 转义引号、、/、\r、\n、\b、\f、\t 和其他控制字符。

        import org.json.simple.JSONValue;
        JSONValue.escape("test string");
        

        使用maven时添加pom.xml

        <dependency>
            <groupId>com.googlecode.json-simple</groupId>
            <artifactId>json-simple</artifactId>
            <scope>test</scope>
        </dependency>
        

        【讨论】:

        【解决方案6】:

        考虑MoshiJsonWriter 类(source)。它有一个很棒的 AP​​I,可以将复制减少到最低限度,所有内容都很好地流式传输到 OutputStream。

        OutputStream os = ...;
        JsonWriter json = new JsonWriter(Okio.sink(os));
        json
          .beginObject()
          .name("id").value(userID)
          .name("type").value(methodn)
          ...
          .endObject();
        

        【讨论】:

        • @slartidan - thx,修复了文档链接并添加了稳定的源文件链接!
        【解决方案7】:

        如果你想简单地转义一个字符串,而不是一个对象或数组,使用这个:

        String escaped = JSONObject.valueToString(" Quotes \" ' ' \" ");
        

        http://www.json.org/javadoc/org/json/JSONObject.html#valueToString(java.lang.Object)

        【讨论】:

          【解决方案8】:

          https://www.json.org/ 的 JSON 规范在设计上非常简单。在 JSON 字符串中转义字符并不难。这段代码对我有用:

          private String escape(String raw) {
              String escaped = raw;
              escaped = escaped.replace("\\", "\\\\");
              escaped = escaped.replace("\"", "\\\"");
              escaped = escaped.replace("\b", "\\b");
              escaped = escaped.replace("\f", "\\f");
              escaped = escaped.replace("\n", "\\n");
              escaped = escaped.replace("\r", "\\r");
              escaped = escaped.replace("\t", "\\t");
              // TODO: escape other non-printing characters using uXXXX notation
              return escaped;
          }
          

          【讨论】:

            【解决方案9】:
            public static String ecapse(String jsString) {
                jsString = jsString.replace("\\", "\\\\");
                jsString = jsString.replace("\"", "\\\"");
                jsString = jsString.replace("\b", "\\b");
                jsString = jsString.replace("\f", "\\f");
                jsString = jsString.replace("\n", "\\n");
                jsString = jsString.replace("\r", "\\r");
                jsString = jsString.replace("\t", "\\t");
                jsString = jsString.replace("/", "\\/");
                return jsString;
            }
            

            【讨论】:

            • 这对我有用...很好的解决方案。
            【解决方案10】:

            Apache Commons

            如果您已经在使用 Apache commons,它为此提供了一个静态方法:

            StringEscapeUtils.escapeJson("some string")
            

            它将任何字符串转换为正确转义以包含在 JSON 中的字符串

            See the documentation here

            【讨论】:

              【解决方案11】:

              build.gradle(如果使用maven,做类似的改变)包含这个依赖:

              implementation group: 'org.apache.avro', name: 'avro-tools', version: '1.10.2'
              

              然后:

              import net.minidev.json.JSONValue;
              String escapedString = JSONValue.escape(yourString);
              

              【讨论】:

                【解决方案12】:

                如果你想在没有任何库的情况下自己做,你可以使用这段 Java 代码:

                /**
                 * Escapes a string the JSON way.
                 *
                 * @param text The text to be escaped.
                 * @return a string escaped according to the JSON format.
                 */
                public static String escape(final CharSequence text) {
                
                    if (text == null) {
                        return "";
                    }
                    final StringWriter writer = new StringWriter();
                    for (int i = 0, length = text.length(); i < length; i++) {
                        final char c = text.charAt(i);
                        switch (c) {
                            case '"':
                                writer.write("\\\"");
                                break;
                            case '\\':
                                writer.write("\\\\");
                                break;
                            default:
                                if (c > 0x1f) {
                                    writer.write(c);
                                } else {
                                    writer.write("\\u");
                                    final String hex = "000" + Integer.toHexString(c);
                                    writer.write(hex.substring(hex.length() - 4));
                                }
                        }
                    }
                    return writer.toString();
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-01-31
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-01-29
                  相关资源
                  最近更新 更多