我正尝试在Scala中创建多行字符串,如下所示。
val errorReport: String =
"""
|{
|"errorName":"blah",
|"moreError":"blah2",
|"errorMessage":{
| "status": "bad",
| "message": "Unrecognized token 'noformatting': was expecting 'null', 'true', 'false' or NaN
at [Source: (ByteArrayInputStream); line: 1, column: 25]"
| }
|}
"""
.stripMargin
这是一个嵌套的JSON,在我打印时无法正确显示。 message
内的errorMessage
字段(这是在getMessage
实例上调用Throwable
的输出)引起此问题的原因,因为看起来好像前面有换行符
at [Source: ...
。
如果我摆脱了这一行,JSON将正确显示。任何有关如何正确格式化的想法都将受到赞赏。
编辑:问题在于换行符。因此,我认为问题更加简洁-如何在三引号内处理换行符,以便仍将其识别为JSON?
编辑2:message
由类似这样的变量设置:
"message": "${ex.getMessage}"
其中ex
是Throwable
。上面提供了该getMessage
调用的内容示例。
答案 0 :(得分:2)
我假设您的问题与JSON无关,并且您只是在询问如何创建非常宽的字符串而不会违反Scala代码中水平80个字符的限制。幸运的是,Scala的字符串文字至少具有以下属性:
"..."
和三引号"""..."""
从普通代码转换为字符串文字模式。${...}
从字符串文字模式转换为普通代码模式+
操作,用于连接字符串文字。|
和stripMargin
,可以使整个构造对空格和缩进具有鲁棒性。总而言之,它使您能够以强大的方式写下任意字符串文字而不会违反水平字符限制。压痕。
在这种情况下,您希望在环境Scala代码中进行换行而不在文本中引入换行符。为此,您只需
"""
退出字符串文字模式+
"""
即
"""blah-""" +
"""blah"""
将创建字符串"blah-blah"
,而在生成的字符串中没有换行符。
适用于您的具体问题:
val errorReport: String = (
"""{
| "errorName": "blah",
| "moreError": "blah2",
| "errorMessage": {
| "status": "bad",
| "message": "Unrecognized token 'noformatting'""" +
""": was expecting 'null', 'true', 'false' or NaN at """ +
"""[Source: (ByteArrayInputStream); line: 1, column: 25]"
| }
|}
"""
).stripMargin
也许更具可读性的选择是将长消息与整齐缩进的JSON分开构造,然后使用字符串插值法将这两个组件组合在一起:
val errorReport: String = {
val msg =
"""Unrecognized token 'noformatting': """ +
"""was expecting 'null', 'true', 'false' or NaN at """ +
"""[Source: (ByteArrayInputStream); line: 1, column: 25]"""
s"""{
| "errorName": "blah",
| "moreError": "blah2",
| "errorMessage": {
| "status": "bad",
| "message": "${msg}"
| }
|}
"""
}.stripMargin
如果邮件本身包含换行符
由于JSON不允许多行字符串文字,因此您必须做其他事情:
.replaceAll("\\n", "")
或更确切地说是.replaceAll("\\n", " ")
\n
对换行符进行编码,请使用.replaceAll("\\n", "\\\\n")
(是...反斜杠...)