Scala创建多行JSON字符串

时间:2019-04-01 18:33:52

标签: json scala string-formatting

我正尝试在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}"

其中exThrowable。上面提供了该getMessage调用的内容示例。

1 个答案:

答案 0 :(得分:2)

我假设您的问题与JSON无关,并且您只是在询问如何创建非常宽的字符串而不会违反Scala代码中水平80个字符的限制。幸运的是,Scala的字符串文字至少具有以下属性:

  • 您可以使用引号"..."和三引号"""..."""从普通代码转换为字符串文字模式。
  • 您可以使用${...}从字符串文字模式转换为普通代码模式
  • 字符上的免费monoid被化为方法,也就是说,存在+操作,用于连接字符串文字。
  • 使用|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")(是...反斜杠...)