如何将原始文本反序列化到Go指定的templateMessage结构体?
问题解决:JSON反序列化报错处理
报错json: cannot unmarshal string into Go value of type main.templateMessage的中文意思是:json无法将字符串反序列化为main.templateMessage类型的值。
问题根源在于你读取的文件内容是被双引号包裹的JSON字符串——相当于你的JSON数据被额外套了一层字符串外壳,直接解析到结构体自然会出现类型不匹配的错误。
解决方法
需要分两步解析:
- 先解析外层的字符串,去掉包裹的引号和转义符,得到真正的JSON对象数据
- 再将处理后的JSON数据解析到
templateMessage结构体中
修改后的代码
package main import ( "encoding/json" "fmt" "os" ) type templateMessage struct { TPL string `json:"tpl"` Metadata []map[string]string `json:"metadata"` Format string `json:"format"` } func main() { var templateMsg templateMessage content, err := os.ReadFile("path-of-the-file/temp.txt") if err != nil { fmt.Println(err) return } // 第一步:解析外层的字符串,获取真实JSON内容 var rawJSON string err = json.Unmarshal(content, &rawJSON) if err != nil { fmt.Println("解析外层字符串失败:", err) return } // 第二步:将真实JSON解析到目标结构体 err = json.Unmarshal([]byte(rawJSON), &templateMsg) if err != nil { fmt.Println("解析JSON到结构体失败:", err) return } fmt.Println(templateMsg) }
补充说明
如果文件内容是手动写入时误加了首尾双引号,也可以直接修改文件去掉首尾引号,之后用你原来的代码就能正常解析;如果是程序生成的这种嵌套格式,上述两步解析的方法更通用。
内容的提问来源于stack exchange,提问作者John Wick
相关产品推荐
相关产品推荐

