Вложенный поток JSON с использованием NewEncoder - PullRequest
0 голосов
/ 07 мая 2018

Мне интересно, возможно ли потоковое воспроизведение 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 голосов
/ 07 мая 2018

Нечто подобное возможно, но не особенно просто. Я сделал нечто подобное в одном из моих проектов с открытым исходным кодом в пиаре, который я еще не объединил. Но вы можете увидеть мой пример здесь .

Интерфейс, который я раскрываю, состоит в том, чтобы взять io.ReadCloser и вернуть (возможно, манипулировать) io.ReadCloser. Внутренне он использует json.Decoder для анализа JSON, возможно добавляя новые данные в поток. Я не уверен, как json.Encoder вписался бы в это (как задано в вашем вопросе).

Создание полного рабочего примера для вас было бы довольно сложной задачей для ответа SO, но я надеюсь, что предоставленная мной ссылка может указать вам верное направление.

Это тот случай, когда хорошие юнит-тесты и подход TDD были бы хорошо рекомендованы!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...