为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中解析一个不熟悉的 YAML/JSON 文件

在 Go 中解析一个不熟悉的 YAML/JSON 文件

Go
牛魔王的故事 2022-03-07 15:38:49
在 Go 中,如何在事先不知道其结构的情况下解析 YAML 数据?我见过的所有示例都假设您想要解码您已经知道其键的封送映射。如果你不知道钥匙怎么办?如果它不是地图而是封送列表、标量或其他一些常见类型怎么办?尽管我主要关注 YAML,但在这里,该技术似乎通常对 JSON 等有用。因为解析结构化数据(显然是标记结构)有一个通用模式。
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

对于 JSON,将数据解组为一个interface{}值。使用类型断言来确定值中的内容。


var v interface{}

err := json.Unmarshal(data, &v)

if err != nil {

   // handle error

}

switch v := v.(type) {

case string:

    fmt.Println("string:", v)

case float64: 

    fmt.Println("number:", v)

case []interface{}:

    fmt.Println("array:", v)

case map[string]interface{}:

    fmt.Println("object:", v)

case nil:

    fmt.Println("nil")

}


查看完整回答
反对 回复 2022-03-07
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

在 JSON 的情况下,json.Unmarshal如果您愿意,标准库函数将解组任意 JSON,如果您将指针传递给未初始化的空接口。(见这个例子。)

官方文档甚至说了这么多:

为了将 JSON 解组为接口值,Unmarshal 将其中一项存储在接口值中:

bool,用于 JSON 布尔值

float64,用于 JSON 数字

字符串,用于 JSON 字符串

[]interface{},用于 JSON 数组

map[string]interface{},用于 JSON 对象

无 JSON null


编辑:虽然没有记录,但yaml包也是如此;我在我的工作站上进行了测试,传入一个指向未初始化的空接口的指针会导致正确的数组、映射和原语的初始化。


查看完整回答
反对 回复 2022-03-07
  • 2 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号