You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将原始文本反序列化到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:05:02