如何检测我的JSON字符串是否在Java中转义了HTML标记

如何检测我的JSON字符串是否在Java中转义了HTML标记,java,json,encoding,Java,Json,Encoding,我试图用Java编写一个单元测试来测试编码的JSON值。我正在努力做到以下几点: assertEquals(expectedJSON(),actualJSON()) expectedJSON返回的位置 我希望expectedJSON返回实际JSON返回的内容,但我无法找到一种简单的方法来实现这一点。我在网上查过了,但是没有找到任何关于这个的容易的东西。actualJSON正在进行一些复杂的处理,需要以这种方式返回值。我的expectedJSON方法如下所示 public String expe

我试图用Java编写一个单元测试来测试编码的JSON值。我正在努力做到以下几点:

assertEquals(expectedJSON(),actualJSON())
expectedJSON返回的位置

我希望expectedJSON返回实际JSON返回的内容,但我无法找到一种简单的方法来实现这一点。我在网上查过了,但是没有找到任何关于这个的容易的东西。actualJSON正在进行一些复杂的处理,需要以这种方式返回值。我的expectedJSON方法如下所示

public String expectedJSONWithHTMLValues(){
        return "{" +
                    "\"someHtml\":{" +
                  "\"html\":\"\u003Chtml\u003EHTML\u0026CSS\u003C/html\u003E\"}}";
    }

反斜杠在字符串常量中具有特殊意义,不仅在写入\时,而且在写入类似\u003C的内容时。在后一种情况下,序列\u003C被Unicode字符U+003C替换,即“”。反斜杠在字符串常量中具有特殊意义,不仅在写入\时,而且在写入类似\u003C的内容时。在后一种情况下,序列\u003C被Unicode字符U+003C替换,该字符是“”以添加到另一个答案中,\U转义在Java中有一个有趣的属性,它们实际上是由编译器预处理的

我的意思是,在转到编译器之前,源文件中的\u个字符将被替换。因此,您的代码:

public String expectedJSONWithHTMLValues(){
    return "{" +
           "\"someHtml\":{" +
           "\"html\":\"\u003Chtml\u003EHTML\u0026CSS\u003C/html\u003E\"}}";
}
正在预处理为:

public String expectedJSONWithHTMLValues(){
    return "{" +
           "\"someHtml\":{" +
           "\"html\":\"<html>HTML&CSS</html>\"}}";
}
为此:

String s = "My
Newline";
这将导致编译器错误,因为字符串文本被拆分为多行

这会让你做一些非常糟糕的事情。例如,这是100%合法Java代码,将在任何操作系统上编译:

\u0070\u0075\u0062\u006c\u0069\u0063 \u0063\u006c\u0061\u0073\u0073 \u004d\u0061\u0069\u006e \u007b

    \u0070\u0072\u0069\u0076\u0061\u0074\u0065 \u0073\u0074\u0061\u0074\u0069\u0063 \u0053\u0074\u0072\u0069\u006e\u0067 \u0073\u006f\u006d\u0065\u0053\u0074\u0072\u0069\u006e\u0067 \u003d \u0022\u004d\u0079 \u0053\u0074\u0072\u0069\u006e\u0067\u0022\u003b

    \u0070\u0075\u0062\u006c\u0069\u0063 \u0073\u0074\u0061\u0074\u0069\u0063 \u0076\u006f\u0069\u0064 \u006d\u0061\u0069\u006e\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d \u0061\u0072\u0067\u0073\u0029 \u007b
        \u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0073\u006f\u006d\u0065\u0053\u0074\u0072\u0069\u006e\u0067\u0029\u003b
    \u007d
\u007d
它打印:

My String
不相信我?编译器首先将所有\u转义转换为字符,这会将\u0070\u0072\u0069\u0076\u0061\u0074\u0065之类的内容转换为私有,或者将\u0073\u0074\u0061\u0074\u0069\u0063\u0053\u0074\u0072\u0069\u006e\u0067转换为字符串

无论如何,要解决您的特定问题,您需要做的只是双重转义\like so:

还值得注意的是,以下字符串:

{"someHtml":{"html":"\u003Chtml\u003EHTML\u0026CSS\u003C/html\u003E"}}
不等于添加了空格的此字符串:

{
    "someHtml": {
        "html": "\u003Chtml\u003EHTML\u0026CSS\u003C/html\u003E"
    }
}

String.equals将在等式中包含空格,因此请确保您的两个字符串每个字符都相同,包括空格。

要添加到另一个答案,转义符在Java中有一个有趣的属性,它们实际上是由编译器预处理的

我的意思是,在转到编译器之前,源文件中的\u个字符将被替换。因此,您的代码:

public String expectedJSONWithHTMLValues(){
    return "{" +
           "\"someHtml\":{" +
           "\"html\":\"\u003Chtml\u003EHTML\u0026CSS\u003C/html\u003E\"}}";
}
正在预处理为:

public String expectedJSONWithHTMLValues(){
    return "{" +
           "\"someHtml\":{" +
           "\"html\":\"<html>HTML&CSS</html>\"}}";
}
为此:

String s = "My
Newline";
这将导致编译器错误,因为字符串文本被拆分为多行

这会让你做一些非常糟糕的事情。例如,这是100%合法Java代码,将在任何操作系统上编译:

\u0070\u0075\u0062\u006c\u0069\u0063 \u0063\u006c\u0061\u0073\u0073 \u004d\u0061\u0069\u006e \u007b

    \u0070\u0072\u0069\u0076\u0061\u0074\u0065 \u0073\u0074\u0061\u0074\u0069\u0063 \u0053\u0074\u0072\u0069\u006e\u0067 \u0073\u006f\u006d\u0065\u0053\u0074\u0072\u0069\u006e\u0067 \u003d \u0022\u004d\u0079 \u0053\u0074\u0072\u0069\u006e\u0067\u0022\u003b

    \u0070\u0075\u0062\u006c\u0069\u0063 \u0073\u0074\u0061\u0074\u0069\u0063 \u0076\u006f\u0069\u0064 \u006d\u0061\u0069\u006e\u0028\u0053\u0074\u0072\u0069\u006e\u0067\u005b\u005d \u0061\u0072\u0067\u0073\u0029 \u007b
        \u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0073\u006f\u006d\u0065\u0053\u0074\u0072\u0069\u006e\u0067\u0029\u003b
    \u007d
\u007d
它打印:

My String
不相信我?编译器首先将所有\u转义转换为字符,这会将\u0070\u0072\u0069\u0076\u0061\u0074\u0065之类的内容转换为私有,或者将\u0073\u0074\u0061\u0074\u0069\u0063\u0053\u0074\u0072\u0069\u006e\u0067转换为字符串

无论如何,要解决您的特定问题,您需要做的只是双重转义\like so:

还值得注意的是,以下字符串:

{"someHtml":{"html":"\u003Chtml\u003EHTML\u0026CSS\u003C/html\u003E"}}
不等于添加了空格的此字符串:

{
    "someHtml": {
        "html": "\u003Chtml\u003EHTML\u0026CSS\u003C/html\u003E"
    }
}

String.equals将在等式中包含空格,因此请确保两个字符串每个字符都相同,包括空格。

为什么需要实际的json文本来匹配?唯一重要的不是反序列化程序生成的值吗?是的,看起来确实如此,但我可以让我的实际JSON返回HTML和CSS,测试仍然通过,所以测试还不够好。我想确保acutalJSON实际返回转义的JSON值。希望这有意义。为什么需要实际的json文本来匹配?唯一重要的不是反序列化程序生成的值吗?是的,看起来确实如此,但我可以让我的实际JSON返回HTML和CSS,测试仍然通过,所以测试还不够好。我想确保acutalJSON实际返回转义的JSON值。希望这是有意义的。\u实际上在Java源文件中的任何地方都有特殊意义-而不仅仅是在字符串Constant中。没错\u在任何地方都有特殊意义。但这里仍然是一种简单的情况,需要两个反斜杠才能将文字反斜杠插入字符串。@artbristol不仅如此,unicode转义甚至与其他转义序列(如\n或\t)具有不同的语义,正如我在回答中所演示的那样。\u实际上在Java源文件中的任何地方都有特殊的含义,而不仅仅是在字符串中。\n没错\u在任何地方都有特殊的含义。但这里仍然是一个简单的情况,即需要两个反斜杠才能将文字反斜杠插入字符串。@artbristol不仅如此,unicode转义甚至与其他转义序列(如\n或\t)具有不同的语义,正如我在回答中所演示的。谢谢你,Brian,这是一个grea
I don’谢谢你,布莱恩,这是一个很好的解释