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

5

我需要将JSON数据以字符串形式保存在我的代码中,用于单元测试。例如:

{
    "one": 1,
    "two": 2
}

我知道我可以从文件或属性中读取这些数据,但我需要将它们保留为字符串。目前,我的代码类似于以下内容:

String s = "{\n" +
           "    \"one\": 1,\n" +
           "    \"two\": 2\n" +
           "}";

但它看起来很丑,在更复杂的数据中,阅读和修改都很困难。

我可以去掉\n,因为它们并不真正需要,但是为了以后漂亮地查看这些数据:

String s = "{" +
           "    \"one\": 1," +
           "    \"two\": 2" +
           "}";

此外,我可能会使用引号替换技巧:

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

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

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

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

s = """
{
    "one": 1,
    "two": 2
}
"""

2
我相信当前版本的Java通过文本块支持多行字符串,采用与您呈现的相同的三引号语法。 - Dmytro
你也可以考虑使用 Kotlin 编写测试,因为 Kotlin 支持多行字符串(https://kotlinlang.org/docs/basic-types.html#string-literals),并且你可以从其他 Kotlin 特性中受益(我发现反引号允许函数名包含空格非常适合测试)。 - ndc85430
1个回答

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
}""";

除了常规字符串外,文本块还支持转义序列,但你不需要在文本块内转义引号。

请注意,开头的定界符"""应该立即跟随行终止符,就像上面的例子一样。

备选方案

如果你的项目使用的是不支持文本块的Java版本,但你又不想使用字符串拼接,可以将JSON放入文本文件中,然后逐行读取。

使用Java 11,你可以使用一个代码行将整个文件内容读取到一个字符串中,方法是使用Files.readString()

String myJSON = Files.readString(path);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接