
本文详解如何在Go中正确解析含转义换行符( )的JSON字符串,指出常见错误:原始换行符非法、结构体定义不匹配、反序列化目标类型错误,并提供可运行的修复方案。
本文详解如何在go中正确解析含转义换行符(` `)的json字符串,指出常见错误:原始换行符非法、结构体定义不匹配、反序列化目标类型错误,并提供可运行的修复方案。
在JSON规范中,字符串内的换行必须以转义序列 形式出现,而不能是实际的换行字符(U+000A)。你提供的原始字符串:
{"Message":"Hi
:Hello everyone"}
若其中的 是真实换行(即字符串字面量中直接回车),则JSON语法非法——这正是 invalid character ' ' in string literal 错误的根源。
✅ 正确写法:确保 是两个字符 + n,而非真实换行
在Go中构造JSON字符串时,需注意字符串字面量类型:
- 解释型字符串字面量(双引号):反斜杠需双重转义 → "Hi\n:Hello everyone"
- 原始字符串字面量(反引号):反斜杠无需转义 → `Hi :Hello everyone`
✅ 推荐使用原始字符串避免转义混乱:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
s := `[{"Name":"Neo","Message":"Hi
:Hello everyone"},{"Name":"Sam","Message":"Hello
Every
One"}]`
✅ 正确结构体定义与反序列化目标
原代码存在三处关键错误:
- Person 字段名与JSON键不匹配("Name" → Messages 字段);
- Messages 字段标签写错(应为 "Message",且类型应为 string 而非 []string);
- JSON顶层是数组,却试图反序列化到单个 Person 实例,应使用 []Person。
修正后的完整可运行代码如下:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"Name"`
Message string `json:"Message"` // 注意字段名和标签一致,且拼写正确(原代码中"Messsage"有误)
}
func main() {
// 使用原始字符串字面量,天然支持
作为转义序列
s := `[{"Name":"Neo","Message":"Hi
:Hello everyone"},{"Name":"Sam","Message":"Hello
Every
One"}]`
var persons []Person // 反序列化目标必须是切片,匹配JSON数组
err := json.Unmarshal([]byte(s), &persons)
if err != nil {
fmt.Printf("JSON解析失败: %v
", err)
return
}
for _, p := range persons {
fmt.Printf("Name: %s, Message: %q
", p.Name, p.Message)
// 输出示例:Name: Neo, Message: "Hi
:Hello everyone"
// 注意:Message字段值中
已被正确解析为换行符(运行时生效)
}
}
⚠️ 注意事项
- JSON字符串中的 在解析后会自动转换为Go中的换行符(' '),打印时将实际换行;若需显示为字面量 ,请用 %q 格式化输出(如上例)或 strings.ReplaceAll(p.Message, " ", "\n")。
- 拼写敏感:"Messsage"(多一个s)会导致字段无法绑定,务必核对JSON键名与结构体标签。
- 始终校验 err:json.Unmarshal 失败时返回非nil错误,不可忽略。
掌握JSON转义规则与Go结构体映射逻辑,是安全解析外部数据的基础。遵循上述规范,即可稳定处理含换行、制表符等转义序列的JSON内容。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










