Эффективно определить тег JSON - PullRequest
0 голосов
/ 03 октября 2018

У меня есть куча JSON-файлов, каждый из которых содержит очень большой массив сложных данных.Файлы JSON выглядят примерно так:

ids.json

{
    "ids": [1,2,3]
}

names.json:

{
    "names": ["Tyrion","Jaime","Cersei"]
}

и так далее.(На самом деле, элементы массива являются сложными объектами структуры с 10 полями)

Я хочу извлечь просто тег, который указывает, какой массив он содержит.В настоящее время я использую encoding/json, чтобы распаковать весь файл в map[string]interface{} и выполнить итерацию по карте, но это слишком дорогая операция.

Есть ли более быстрый способ сделать это, желательно без участиядемаршалирования целых данных?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Я поиграл с Decoder.Token(), читая по одному токену за раз (см. пример , строка 87), и это работает для извлечения метки массива:

const jsonStream = `{
    "ids": [1,2,3]
}`

dec := json.NewDecoder(strings.NewReader(jsonStream))

t, err := dec.Token()
if err != nil {
    log.Fatal(err)
}

fmt.Printf("First token: %v\n", t)

t, err = dec.Token()
if err != nil {
    log.Fatal(err)
}

fmt.Printf("Second token (array label): %v\n", t)
0 голосов
/ 03 октября 2018

Вы можете сместить считыватель сразу после открывающей фигурной скобки, а затем использовать json.Decoder для декодирования только первого токена из считывателя.

Что-то в этом духе

sr := strings.NewReader(`{
    "ids": [1,2,3]
}`)

for {
    b, err := sr.ReadByte()
    if err != nil {
        fmt.Println(err)
        return
    }
    if b == '{' {
        break
    }
}

d := json.NewDecoder(sr)

var key string
err := d.Decode(&key)
if err != nil {
    fmt.Println(err)
    return
}

fmt.Println(key)

https://play.golang.org/p/xJJEqj0tFk9

Кроме того, вы можете заключить io.Reader, полученный от open, в bufio.Reader, чтобы избежать нескольких однобайтовых записей

ЭтоРешение предполагает, что содержимое является допустимым объектом JSON.Не то чтобы ты все равно мог этого избежать.

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