【问题标题】:Figuring out the right struct to parse a simple YAML file in Golang找出正确的结构来解析 Golang 中的简单 YAML 文件
【发布时间】:2017-08-22 17:52:47
【问题描述】:

我有一个相当简单的 YAML 文档可以在 Go 中解析为(最好)映射。

YAML 文档:

---
A: Logon
'0': Heartbeat
'1': Test Request
'2': Resend Request
'3': Reject
'4': Sequence Reset
'5': Logout
'8': Execution Report
S: Quote
AE: Trade Capture Report
B: News
h: Trading Session Status
f: Security Status

我正在尝试将其编组

type TranslationVal struct {
    Map map[string]string
}

translationVal := TranslationVal{}
err := yaml.Unmarshal([]byte(val), &translationVal)

但是我得到了:

2017/08/22 20:33:23 yaml: unmarshal errors:   line 1: cannot unmarshal !!str `A` into main.TranslationVal

【问题讨论】:

标签: go yaml


【解决方案1】:

问题是由于您将地图包装在一个对象中,YAML 没有这样的嵌套。

map := map[string]string{}
err := yaml.Unmarshal([]byte(val), &map)

您实际上可以直接解组到地图本身

编辑:很难用你的格式来判断,但是如果这些整数键嵌套在A 下,那么你也需要一个不同的结构,它实际上是一个map[string]map[string]string——但是那很丑所以我会建议此时移至不同的范例...您可以使用map[string]interface{},它不会关心映射中的类型,然后您可以稍后处理它,或者您可以更静态地定义对象,实际上使用在结构中键入 A 这样的键来表示每个项目的去向,如果是这种情况,您将拥有如下所示的对象;

type TranslationVal struct {
    A map[string]string
    B string
    C string
    // and so on
    F string `yaml:f` // necessary because f would be unexported
}

【讨论】:

  • 我提供的 YAML 示例中没有嵌套。不幸的是,您建议的直接使用 map[string]string{} 的解决方案不起作用并产生相同的错误:line 1: cannot unmarshal !!str 'A' into map[string]string
【解决方案2】:

我实际上试图解析一个根本不是 YAML 的值,呵呵!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多