【问题标题】:How to convert newlines to proper JSON in GO? [duplicate]如何在 GO 中将换行符转换为正确的 JSON? [复制]
【发布时间】:2018-11-14 08:35:37
【问题描述】:

我有一些字符串想要转换为 JSON。这里使用encoding/json,其他包没试过。

如果按原样保存,字符串可能包含换行符和其他破坏 JSON 的内容。

如果我传递一个字符串文字,它会起作用 - 它会在反斜杠前面添加反斜杠。如果我只传递一个常规字符串,它就行不通。我似乎无法弄清楚是否有办法使用包含字符串文字的变量。

编辑:正如所指出的,这些不是相同的值,我有点理解,但这并不能帮助我解决我的问题。

示例代码:

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    type Test struct {
        Input string
    }
    regularString := Test{"asd\nqwe"}
    out, err := json.Marshal(regularString)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(out))

    literalString := Test{`asd\nqwe`}
    out, err = json.Marshal(literalString )
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(out))
}

【问题讨论】:

  • 您期望的样本输出是什么?如果它更清楚,我已经添加了几个额外的Printlns,它们显示了在 go playground here 中编码的字符串。注意第一个有一个实际的新行,第二个有一个 \n ,它将在 json 中编码为 \\n 以防止它被解释为一个新行。

标签: json string go string-literals


【解决方案1】:

encoding/json 正确编码所有字符串值。

您的第一个示例按您的预期工作,因为您使用了一个解释的字符串文字,如果其中包含\n 序列,编译器会将其替换为换行符。

您的第二个示例没有按预期工作,因为您使用了 原始字符串文字,如果包含 \n 序列,则不会被替换,但这两个字符将保留在字符串中。这将被 encoding/json 正确转义,以保留在 JSON 输出中。

基本上是这样

"asd\nqwe"`

`asd\nqwe`

是 2 个不同的字符串,它们不相等,因此它们的 JSON 转义值也不同。

查看Spec: String literals了解更多详情。

请注意,如果您想使用原始字符串文字创建字符串值,则不能在其中使用转义序列。要在原始字符串文字中添加换行符,只需换行即可,如下所示:

s := `asd
qwe`

另一种选择是“打破”字符串文字,并使用解释的字符串文字插入换行符(并连接部分):

s := `asd` + "\n" + `qwe`

【讨论】:

  • 对,有道理。我怎样才能让它工作呢?
  • @LauriK:什么不起作用?您已证明它可以与 " 一起使用。
  • @LauriK 是的,它正在工作。如果您希望字符串包含换行符,请使用包含换行符而不是反斜杠后跟 n 字符的字符串值。
  • @LauriK 添加了如何在原始字符串文字中包含换行符的示例。
猜你喜欢
  • 2021-12-10
  • 2021-07-04
  • 2020-05-10
  • 2018-10-28
  • 2012-05-03
  • 2019-08-07
  • 2011-08-13
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多