将“\ n”嵌入到字符串文字中时出错

时间:2016-08-16 14:26:53

标签: go

我需要解码其中包含“\ n”的JSON字符串:

[
    {"Name":"Neo", "Message":"Hi\n:Hello everyone"},
    {"Name":"Sam","Messsage":"Hello\nEveery\nOne"}
]

我使用下面的Golang代码:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Messages  []string     `json:"Name,omitempty"`
}

func main() {
s := "[{\"Name\":\"Neo\", \"Message\":\"Hi\n:Hello everyone\"},   {\"Name\":\"Sam\",\"Messsage\":\"Hello\nEveery\nOne\"}]"
var pro Person
err := json.Unmarshal([]byte(s), &pro)
if err == nil {
fmt.Printf("%+v\n", pro)
} else {
fmt.Println(err)
fmt.Printf("%+v\n", err)
}
}

但我收到错误:

ERROR invalid character '\n' in string literal

2 个答案:

答案 0 :(得分:6)

这里有一些问题。第一个是JSON字符串中不允许换行。使用两个字节\n指定换行符,而不是实际换行符。如果您使用解释的字符串文字,则必须使用\引用\。例如:

"Hello\\nWorld"

原始字符串文字中不需要引号:

`Hello\nWorld`

下一个问题是JSON值是一个对象值数组。要处理数组,请对切片进行解组:

var pro []Person
err := json.Unmarshal([]byte(s), &pro)

要处理对象,请将Person定义为结构:

type Person struct {
  Name    string
  Message string
}

working example on the playground

答案 1 :(得分:1)

使用反引号,就像这个工作示例代码:

package main

import (
    "encoding/json"
    "fmt"
)

type Person struct {
    Name    string `json:"Name"`
    Message string `json:"Message"`
}

func main() {
    s := `
[
    {"Name":"Neo", "Message":"Hi\n:Hello everyone"},
    {"Name":"Sam", "Message":"Hello\nEvery\nOne"}
]   
    `
    var pro []Person
    err := json.Unmarshal([]byte(s), &pro)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%q\n", pro)
    fmt.Println()
    fmt.Println(pro)

}

输出:

[{"Neo" "Hi\n:Hello everyone"} {"Sam" "Hello\nEvery\nOne"}]

[{Neo Hi
:Hello everyone} {Sam Hello
Every
One}]