gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:37:21 25 4
gpt4 key购买 nike

我正在尝试用 Java 编写单元测试来测试编码的 JSON 值。我正在尝试执行以下操作:

assertEquals(expectedJSON(),actualJSON())

expectedJSON() 返回的地方

{
"someHtml": {
"html": "<html>HTML&CSS</html>"
}
}

actualJSON() 返回

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

我希望 expectedJSON 返回 actualJSON() 返回的内容,但我无法找到一种简单的方法来执行此操作。我在网上看过,但没有轻易找到任何东西。 actualJSON() 正在做一些复杂的处理,需要以这种方式返回值。我的 expectedJSON() 方法如下所示

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

最佳答案

要添加到其他答案,\u转义符在 Java 中有一个有趣的属性,它们实际上被编译器 ( JLS §3.3 ) 预处理

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

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

正在被预处理为:

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

就是正在编译的内容。

Java 编译器将把任何 \u在实际编译文件之前转义到字符中。这意味着 \u转义符可用于变量名、类名、方法名等。编译器会把它变成字符本身,并在编译过程中使用它。这就是为什么你应该使用 \n在你的字符串中而不是 \u000a .如果您使用后者,源代码将如下所示:

String s = "My\u000aNewline";

对此:

String s = "My
Newline";

这会导致编译器错误,因为 String文字被分成多行。

这可以让你做一些极其糟糕的事情。例如,这是 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

不相信我? See for yourself.编译器首先转换所有\u逃逸成字符,这需要像\u0070\u0072\u0069\u0076\u0061\u0074\u0065这样的一切并将其转换为 private , 或 \u0073\u0074\u0061\u0074\u0069\u0063\u0053\u0074\u0072\u0069\u006e\u0067进入String .

无论如何,要解决您的特定问题,您需要做的就是两次转义 \像这样:

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

还值得注意的是这个字符串:

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

不等于添加了空格的字符串:

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

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

关于java - 如何检测我的 JSON 字符串是否在 Java 中转义了 HTML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18542996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com