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

时间:2016-08-28 00:15:56

标签: json go yaml

如何在Go中解析YAML数据,而不事先知道其结构?我见过的所有示例都假设您要解码已经知道其密钥的封送映射。如果你不知道钥匙怎么办?如果它不是地图而是封送列表,标量或其他常见类型会怎么样?

虽然我主要关注的是YAML,但是这里似乎该技术对JSON等通常很有用..因为解析结构化数据有一般模式(显然是标记结构)。

2 个答案:

答案 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包也是如此;我在我的工作站上测试过,并且传入指向未初始化的空接口的指针会导致正确的数组,映射和基元的初始化。