当前位置: 首页 > 知识库问答 >
问题:

解析YAML并返回行号

伊温书
2023-03-14

我正在从Go中的YAML输入创建一个文档生成器。它需要指定每个项目/节点是从YAML文件的哪一行生成的。有没有办法在Go中实现?

例如,这是一个YAML文件

- key1: item 1
  key2: item 2
- key1: another item 1
  key2: another item 2

我希望看到以下内容

[
     {'__line__': 1, 'key1': 'item 1', 'key2': 'item 2'},
     {'__line__': 3, 'key1': 'another item 1', 'key2': 'another item 2'},
]

我看到一个类似的问题回答了Python解析YAML,返回行号,但我不知道如何利用https://pkg.go.dev/gopkg.in/yaml.v3

共有1个答案

曾飞沉
2023-03-14

在 Go 中,这可以通过实现自定义解编拆器并手动设置行号来实现。

因此,让我们构建文件所需的数据结构:

type ListItem struct {
    Line int

    ListItemData
}

type ListItemData struct {
    Key1 string `yaml:"key1"`
    Key2 string `yaml:"key2"`
}

现在,我们通过在< code>ListItem类型上创建一个方法来实现解组器接口:

golang prettyprint-override">func (li *ListItem) UnmarshalYAML(value *yaml.Node) error {
    err := value.Decode(&li.ListItemData)
    if err != nil {
        return err
    }
     
    // Save the line number
    li.Line = value.Line

    return nil
}

您会注意到我创建了一个内部结构,并且只将数据解码为该结构。这是因为如果我们在 li 本身上调用 Decode,我们会得到一个堆栈溢出,因为解码会反复调用 UnmarshalYAML 方法。

你可以在网上试试,看看行号设置是否正确。

 类似资料:
  • 这是我第一次使用YAML文件,所以我首先想到的是找到任何可以帮助我解析文件的库。 我找到了两个库,YamlBean和snakeyaml。我不确定我要用哪一个。 下面是我试图解析的文件的一个示例: 该文件将动态更改,所以我不知道该文件将包含多少用户或组。 有人能帮我开始吗?最好的图书馆是什么?YamlBean还是Snakeyaml? 我想,我需要将这些信息保存在一个可以轻松重复的东西中。

  • 我收到一个YAML文件,我使用snakeyaml引擎解析(对于YAML 1.2)。 然后我使用GSON将其转换为JsonObject。 我们的目标是运行这个YAML,对照已知的数据模型检查它。如果字段不同,必填字段丢失等,我必须为每个字段返回一个错误。我们的目标是找到某种方法来包含原始YAML中问题字段的行号,但是当我通过JSON进行验证时,遇到错误时,我不知道原始行号。我很好奇,是否有一些简单的

  • 问题内容: 我有像 由Web服务器呈现为HTML。我需要将这些字符串转换为 当前,这就是我正在做的事情(借助于jQuery): 但是我有一种不安的感觉,我做错了。我努力了 但它似乎无效,decodeURI / decodeURIComponent也无效。 还有其他更自然,更优雅的方式吗? 问题答案: 用于从JavaScript解释HTML(文本和其他形式)的一个更现代的选项是API中的HTML支持

  • 问题内容: 我想要一个带字符串并返回一个数组的Python函数,该数组中的每个项目都是字符,或者是这种类型的另一个数组。嵌套数组在输入字符串中以’(’开始,以’)’结尾。 因此,该函数将如下所示: 注意:我更喜欢纯功能的解决方案。 问题答案: 和,

  • 我显然误解了jspromise的解决方式或“返回”的语义 我被一个期望我是同步的函数调用——返回一个值。计算该值需要一些异步代码(特别是dstore集合上的ForEach方法) 我试图实现的大致是这个,但这不起作用,因为函数mySynchronousFunction没有返回值。 我知道JS必须允许单线程实现,所以阻止它并不酷,但必须有某种模式用于将异步代码粘合到同步代码,我刚刚错过了这种模式。

  • 我有一个像这样的数组 我需要把所有的交集组成一个阵列。就像这样。 这是我的尝试,但丢失了。