有没有办法确保解析yaml字符串中的所有数据?

时间:2016-10-05 19:52:28

标签: go yaml

为了测试,我经常看到代码读取字节切片,使用yaml将其解析为结构,例如:

https://github.com/kubernetes/kubernetes/blob/master/pkg/util/strategicpatch/patch_test.go#L74m

我只是因为没有导出我的字段名而被咬了,导致我在我的测试用例中迭代了一个空列表,因此假设所有测试都通过了(事后看来,应该是一个红旗:))。还有其他错误被yaml unmarshaling默默忽略,例如一个键拼写错误并且没有完全匹配结构字段。

有没有办法确保字节切片中的所有数据实际都被解析为yaml.Unmarshal返回的结构?如果没有,其他人如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

go-yaml/yaml

对于搜索此问题的解决方案的任何人,yaml.v2库都有一个UnmarshalStrict方法,如果yaml文档中的键中没有相应字段,则该方法会返回错误。

import yaml "gopkg.in/yaml.v2"

err := yaml.UnmarshalStrict(data, destinationStruct)

BurntSushi/toml

这不是问题的一部分,但我只是想记录如何在toml中实现类似的东西:

您可以找到toml文件中是否有任何键无法使用toml.decode函数返回的元数据进行解码。

import "github.com/BurntSushi/toml"

metadata, err := toml.Decode(data, destinationStruct)
undecodedKeys := metadata.Undecoded()

请注意,metadata.Undecoded()还会返回由于Primitive值而未解码的键。你可以read more about it here

Json

默认的go json库目前不支持此功能,但有一个proposal ready to be merged。似乎它将成为1.10的一部分。