Разбор JSON от Kinesis Firehose - PullRequest
       11

Разбор JSON от Kinesis Firehose

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

Привет, я пытаюсь использовать Kinesis Firehose с S3.И я попытался прочитать эти файлы S3.Я использую GO для его чтения.

Однако я не могу разобрать JSON, потому что значения добавляются только без разделителя.

вот пример файла (обратите внимание, чтоисходные данные добавляются друг к другу, я разбил их на новую строку для форматирования):

{"ticker_symbol":"PLM","sector":"FINANCIAL","change":-0.16,"price":19.99}
{"ticker_symbol":"AZL","sector":"HEALTHCARE","change":-0.78,"price":16.51}
{"ticker_symbol":"IOP","sector":"TECHNOLOGY","change":-1.98,"price":121.88}
{"ticker_symbol":"VVY","sector":"HEALTHCARE","change":-0.56,"price":47.62}
{"ticker_symbol":"BFH","sector":"RETAIL","change":0.74,"price":16.61}
{"ticker_symbol":"WAS","sector":"RETAIL","change":-0.6,"price":16.72}

мой вопрос, как я могу разобрать его в Go?одно решение, которое я могу придумать, это разделить их на }{ и добавить их снова.Но это довольно хакерски.

Или Kinesis Firehose предоставляет разделитель?

------ ОБНОВЛЕНИЕ ------

В настоящее время я реализовал решение, заменив все }{ на },{, а затем добавив [ в начале и ] в конце.Тогда разбери это.

Однако я все еще ищу альтернативы, так как это решение ограничит любое }{ в содержимом объекта json

1 Ответ

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

Создайте простую структуру, чтобы демонтировать JSON, который поступает в пакетном режиме.Таким образом, каждая партия json отправляется в объект json.Затем создайте фрагмент структур, чтобы добавить проанализированный json в фрагмент.Это добавит вам результат json all в виде фрагмента структуры.

package main

import (
    "encoding/json"
    "fmt"
)

type Ticker struct {
    TickerSymbol string  `json:"ticker_symbol"`
    Sector       string  `json:"sector"`
    Change       float64 `json:"change"`
    Price        float64 `json:"price"`
}

var jsonBytes = []byte(`{"ticker_symbol":"PLM","sector":"FINANCIAL","change":-0.16,"price":19.99}`)

func main() {
    var singleResult Ticker
    var result []Ticker
    if err := json.Unmarshal(jsonBytes, &singleResult); err != nil {
        fmt.Println(err)
    }

    if len(result) == 0 {
        result = append(result, singleResult)
    }
    fmt.Printf("%+v", result)
}

Отредактировано:

Если данные поступают в виде пакета, который содержит объекты json, добавленные друг к другучем вы можете перейти к выражению регулярного выражения, чтобы заменить } на },, а затем обрезать самое правое ,, чтобы создать действительный массив объектов json:

package main

import (
    "fmt"
    "regexp"
    "strings"
)

type Ticker struct {
    TickerSymbol string  `json:"ticker_symbol"`
    Sector       string  `json:"sector"`
    Change       float64 `json:"change"`
    Price        float64 `json:"price"`
}

var str = `{"ticker_symbol":"PLM","sector":"FINANCIAL","change":-0.16,"price":19.99}
{"ticker_symbol":"AZL","sector":"HEALTHCARE","change":-0.78,"price":16.51}
{"ticker_symbol":"IOP","sector":"TECHNOLOGY","change":-1.98,"price":121.88}
{"ticker_symbol":"VVY","sector":"HEALTHCARE","change":-0.56,"price":47.62}
{"ticker_symbol":"BFH","sector":"RETAIL","change":0.74,"price":16.61}
{"ticker_symbol":"WAS","sector":"RETAIL","change":-0.6,"price":16.72}`

func main() {

    r := regexp.MustCompile("}")
    output := strings.TrimRight(r.ReplaceAllString(str, "},"), ",")
    output = fmt.Sprintf("[%s]", output)
    fmt.Println(output)
}

Использование r := regexp.MustCompile("}") поможет вамне беспокоиться о пробелах между }{, которые могут помешать замене строки.Поэтому просто замените } на }, и затем обрежьте вправо.

Также причина, по которой я использую MustCompile:

При создании констант с регулярными выражениями вы можете использовать MustCompileВариант компиляции.Простой компиляция не будет работать для констант, потому что он имеет 2 возвращаемых значения.

Полный рабочий код с анализом json на Перейти на игровую площадку

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