簡體   English   中英

Scala創建多行JSON字符串

[英]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,當我打印它時它沒有正確顯示。 errorMessagemessage字段(這是在Throwable實例上調用getMessage的輸出)導致問題,因為它看起來好像之前有一個換行符

at [Source: ...

如果我擺脫那條線,JSON會正確顯示。 任何有關如何正確格式化這一點的想法都值得贊賞

編輯:問題在於換行符。 所以我認為問題更簡潔 - 如何處理三重引號中的換行符,以便它仍然被識別為JSON?

編輯2: message由變量設置如下:

"message": "${ex.getMessage}"

其中exThrowable 上面提供了該getMessage調用的內容示例。

我假設您的問題與JSON無關,並且您只是詢問如何創建非常寬的字符串而不違反Scala代碼中的水平80字符限制。 幸運的是,Scala的字符串文字至少具有以下屬性:

  • 您可以使用引號"..."和三引號"""..."""從普通代碼轉換為字符串文字模式。
  • 你可以使用${...}從字符串文字模式轉換到普通代碼模式
  • 字符上的自由monoid被稱為方法,也就是說,存在連接字符串文字的+操作。
  • 使用|可以使整個結構對空白和縮進具有魯棒性 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM