在 Java 中将 JSON 数据硬编码为字符串的更好方法

Max*_*lov 6 java string json multilinestring java-text-blocks

我需要将 JSON 数据作为字符串保存在代码中以进行单元测试。例如,

{
    "one": 1,
    "two": 2
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以从文件或属性中读取这些数据,但我需要将它们保留为字符串。目前,我有这样的事情:

String s = "{\n" +
           "    \"one\": 1,\n" +
           "    \"two\": 2\n" +
           "}";
Run Code Online (Sandbox Code Playgroud)

但它看起来很难看,而且在更复杂的数据中,很难读取和修改它。

我可能会摆脱它们\n,因为它们并不是真正需要的,而是为了稍后更好地查看这些数据:

String s = "{" +
           "    \"one\": 1," +
           "    \"two\": 2" +
           "}";
Run Code Online (Sandbox Code Playgroud)

另外,我可以使用引号替换的技巧:

String s = ("{\n" +
            "    'one': 1,\n" +
            "    'two': 2\n" +
            "}").replace('\'','"');
Run Code Online (Sandbox Code Playgroud)

或者同时将两者结合起来。

有没有更好的方法在 Java 中将 JSON 数据表示为 a String

例如,在Python中,有三引号:

s = """
{
    "one": 1,
    "two": 2
}
"""
Run Code Online (Sandbox Code Playgroud)

Ale*_*nko 6

文本块 - Java 15+

如果您使用 Java 15 或更高版本来表示 JSON 数据而不是字符串连接(由于需要转义每个引号,字符串连接既繁琐又容易出错),您可以使用文本

要创建文本块,您需要将多行文本括在三个双引号字符中"""

String myJSON = """ // no characters should appear after the opening delimiter - the text starts from the next line
{
    "one": 1,
    "two": 2
}""";
Run Code Online (Sandbox Code Playgroud)

与常规字符串一样,文本块也支持转义序列,但您不需要转义文本块内的引号。

请注意,开始定界符后"""紧跟终止符,如上例所示。

备择方案

如果您的项目使用的 Java 版本不支持文本块,但您不想使用字符串连接进行拨号,则可以将 JSON 放入文本文件中,然后逐行读取它。

使用 Java 11,您可以使用以下命令将整个文件内容读取到一个字符串中Files.readString()

String myJSON = Files.readString(path);
Run Code Online (Sandbox Code Playgroud)