
在Go中解析含换行符的JSON时,需确保JSON字符串本身符合规范(使用\n而非实际换行),并正确定义目标结构体及反序列化类型(应为[]Person而非单个Person)。
在go中解析含换行符的json时,需确保json字符串本身符合规范(使用`\n`而非实际换行),并正确定义目标结构体及反序列化类型(应为`[]person`而非单个`person`)。
JSON标准明确规定:字符串字面量中不允许出现未转义的实际换行字符( )。若原始数据中包含换行意图,必须以JSON转义序列 \n 形式表示(即字符串中真实存储两个字符:反斜杠和字母n),而非插入真实的换行符。否则,json.Unmarshal 会报错 invalid character ' ' in string literal。
此外,常见错误还包括结构体定义与JSON结构不匹配、反序列化目标类型错误。例如,示例JSON是一个对象数组([{"Name":..., "Message":...}, ...]),因此必须反序列化为 []Person 类型,而非单个 Person;同时字段名需与JSON键精确对应(注意原代码中存在拼写错误:Messsage → Message)。
以下是修正后的完整可运行代码:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"Name"`
Message string `json:"Message"` // 注意:原代码中字段名拼写错误(Messsage)
}
func main() {
// ✅ 正确:JSON字符串中换行用 "\n" 表示(双反斜杠),且无实际换行符
s := `[{"Name":"Neo","Message":"Hi\n:Hello everyone"},{"Name":"Sam","Message":"Hello\nEvery\nOne"}]`
var persons []Person // ✅ 反序列化为切片,匹配JSON数组结构
err := json.Unmarshal([]byte(s), &persons)
if err != nil {
fmt.Printf("解析失败: %v
", err)
return
}
for _, p := range persons {
fmt.Printf("Name: %s, Message: %q
", p.Name, p.Message)
// 输出示例:Message: "Hi
:Hello everyone" —— 运行时已解析为含真实换行的字符串
}
}
关键要点总结:
- ? JSON字符串内换行必须写作 \n:在Go源码中定义JSON字符串字面量时,因Go字符串本身也需转义,故需写成 \n(最终生成JSON中的 );若使用Go原始字符串字面量(`...`),则直接写 即可(如 `{"msg":"Hello World"}`)。
- ? 结构体字段名与JSON键严格对应:通过 json:"Key" 标签显式声明映射关系,避免大小写或拼写错误(如 Messsage → Message)。
- ? 反序列化类型必须匹配JSON结构:JSON数组 → Go切片([]Person);JSON对象 → Go结构体(Person)。
- ? 运行时行为:json.Unmarshal 会自动将JSON中的 转换为Go字符串中的真实换行符,后续可直接用于打印或处理。
遵循以上规则,即可安全、准确地解析含转义字符的JSON数据。










