如何在Go中解析YAML数据,而不事先知道其结构?我见过的所有示例都假设您要解码已经知道其密钥的封送映射。如果你不知道钥匙怎么办?如果它不是地图而是封送列表,标量或其他常见类型会怎么样?
虽然我主要关注的是YAML,但是这里似乎该技术对JSON等通常很有用..因为解析结构化数据有一般模式(显然是标记结构)。
答案 0 :(得分:1)
对于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")
}
答案 1 :(得分:1)
对于JSON,如果您愿意,标准库json.Unmarshal
函数将解组任意JSON,如果您将指针传递给未初始化的空接口。 (见this example.)
official docs甚至可以说:
要将JSON解组为接口值,Unmarshal会将其中一个存储在接口值中:
bool,适用于JSON布尔值
float64,用于JSON编号
字符串,用于JSON字符串
[] interface {},用于JSON数组
map [string] interface {},用于JSON对象
为JSON null
为零
编辑虽然没有记录,但yaml包也是如此;我在我的工作站上测试过,并且传入指向未初始化的空接口的指针会导致正确的数组,映射和基元的初始化。