[英]Scala create multi-line JSON String
我正在尝试在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,当我打印它时它没有正确显示。 errorMessage
的message
字段(这是在Throwable
实例上调用getMessage
的输出)导致问题,因为它看起来好像之前有一个换行符
at [Source: ...
如果我摆脱那条线,JSON会正确显示。 任何有关如何正确格式化这一点的想法都值得赞赏
编辑:问题在于换行符。 所以我认为问题更简洁 - 如何处理三重引号中的换行符,以便它仍然被识别为JSON?
编辑2: message
由变量设置如下:
"message": "${ex.getMessage}"
其中ex
是Throwable
。 上面提供了该getMessage
调用的内容示例。
我假设您的问题与JSON无关,并且您只是询问如何创建非常宽的字符串而不违反Scala代码中的水平80字符限制。 幸运的是,Scala的字符串文字至少具有以下属性:
"..."
和三引号"""..."""
从普通代码转换为字符串文字模式。 ${...}
从字符串文字模式转换到普通代码模式 +
操作。 |
可以使整个结构对空白和缩进具有鲁棒性 和stripMargin
。 总而言之,它允许您在不违反水平字符限制的情况下写下任意字符串文字,其方式是强健的缩进。
在这种特殊情况下,您希望在环境标量代码中进行换行,而不在文本中引入换行符。 为此,你干脆
"""
退出字符串文字模式 +
"""
再次重新进入字符串 - 文字模式 那是,
"""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")
(是...反斜杠......)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.