golang yaml对jsonlines的支持

时间:2019-02-21 14:52:06

标签: json go yaml jsonlines

我一直在尝试获取yaml包,以解析带有jsonlines条目的文件。

下面是一个简单的示例,其中包含三个要分析的数据选项。

  • 选项一是多文档yaml示例。两个文档都可以解析。

  • 选项二是两个jsonline示例。第一行解析正常,但是第二行被忽略。

  • 选项3是两个jsonline示例,但我在两者之间放置了yaml doc分隔符,以强制解决此问题。这些都可以解析。

通过阅读yaml和json规范,我认为第二个选项,多个jsonlines,应该由yaml解析器处理。

我的问题是:

  • YAML解析器应该处理jsonlines吗?
  • 我可以正确使用go yaml包吗?

package main

import (
    "bytes"
    "fmt"
    "reflect"
    "strings"

    "gopkg.in/yaml.v2"
)

var testData = []string{
    `
---
option_one_first_yaml_doc: ok_here
---
option_one_second_yaml_doc: ok_here
`,
    `
{option_two_first_jsonl: ok_here}
{option_two_second_jsonl: missing}
`,
    `
---
{option_three_first_jsonl: ok_here}
---
{option_three_second_jsonl: ok_here}
`}

func printVal(v interface{}, depth int) {
    typ := reflect.TypeOf(v)
    if typ == nil {
        fmt.Printf(" %v\n", "<null>")
    } else if typ.Kind() == reflect.Int || typ.Kind() == reflect.String {
        fmt.Printf("%s%v\n", strings.Repeat(" ", depth), v)
    } else if typ.Kind() == reflect.Slice {
        fmt.Printf("\n")
        printSlice(v.([]interface{}), depth+1)
    } else if typ.Kind() == reflect.Map {
        fmt.Printf("\n")
        printMap(v.(map[interface{}]interface{}), depth+1)
    }
}

func printMap(m map[interface{}]interface{}, depth int) {
    for k, v := range m {
        fmt.Printf("%sKey: %s Value(s):", strings.Repeat(" ", depth), k.(string))
        printVal(v, depth+1)
    }
}

func printSlice(slc []interface{}, depth int) {
    for _, v := range slc {
        printVal(v, depth+1)
    }
}

func main() {

    m := make(map[interface{}]interface{})

    for _, data := range testData {

        yamlData := bytes.NewReader([]byte(data))
        decoder := yaml.NewDecoder(yamlData)

        for decoder.Decode(&m) == nil {
            printMap(m, 0)
            m = make(map[interface{}]interface{})

        }
    }
}

1 个答案:

答案 0 :(得分:0)

jsonlines是换行符分隔的JSON。这意味着单独的行是JSON,但不是多行,当然也不是包含多行的整个文件。

由于YAML是JSON的超集,因此您将需要一次读取jsonlines输入的一行,并且您应该能够使用go yaml处理这些行。

由于您的测试中似乎还包含YAML指示符(---)行,因此您 也需要处理这些。