使用NewEncoder嵌套的JSON流

时间:2018-05-07 10:42:26

标签: go

我想知道除了流本身之外是否可以流式传输JSON并包含其他(同级)密钥?我想包含一些有关生成文件的额外数据。如下所示:

{
    "info": {
        "department": "a",
        "id": "1",
    },
    "members": [
        { "name": "a", "age": "1" },
        { "name": "b", "age": "2" },
        { "name": "c", "age": "3" },
        ...stream
    ]
}

目前,我将JSON流式传输到平面文件,如下所示:

package main

import (
    "encoding/json"
    "os"
)

type Member struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    enc := json.NewEncoder(os.Stdout)

    letters := []string{"a", "b", "c", "d", "e", "f"}

    for i, letter := range letters {
        key := Member{letter, i}

        var err = enc.Encode(&key)
        if err != nil {
            // handle err
        }
    }
}

但如上所述,我想添加另一个键,例如" info"并在一个键中包含流,例如" members"

我可以想到问题的解决方案,它会将它们作为单独的文件存储在目录中,例如。

directory
├─ members.json
└─ info.json

但是可以添加其他(兄弟)键还是仅限于平面文件?

1 个答案:

答案 0 :(得分:1)

类似的东西是可能的,但它并不是特别简单。我在PR中的一个开源项目中做了类似的事情,我尚未合并。但是你可以看到我的例子here

我公开的接口是接收(...).reshape(X.shape)并返回(可能被操纵)io.ReadCloser。在内部,它使用io.ReadCloser来解析JSON,可能会向流中添加新数据。我不确定json.Decoder如何适合这种情况(如您的问题所述)。

为SO制作一个完整的工作示例对于SO答案来说将是一项相当大的任务,但我希望我提供的链接可以指向正确的方向。

在这种情况下,建议采用良好的单元测试和TDD方法!