Разбор нескольких объектов JSON в golang - PullRequest
0 голосов
/ 15 мая 2018

У меня есть вопрос, связанный с разбором json в golang. Объекты, подобные приведенным ниже, могут быть легко проанализированы с помощью пакета encoding / json.

[ 
    {"something":"foo"},
    {"something-else":"bar"}
]

Проблема, с которой я сталкиваюсь, заключается в том, что с сервера возвращаются несколько диктов, как это -

{"something":"foo"}
{"something-else":"bar"}

Это не может быть проанализировано с использованием приведенного ниже кода.

correct_format := strings.Replace(string(resp_body), "}{", "},{", -1)
json_output := "[" + correct_format + "]"

Я пытаюсь проанализировать данные общего сканирования. - Например

Любая помощь будет оценена.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Другим вариантом будет анализ каждой входящей строки, строка за строкой, а затем добавление каждой из них в коллекцию в коде (т. Е. В срез). Go предоставляет для этого строку scanner .

yourCollection := []yourObject{}
scanner := bufio.NewScanner(YOUR_SOURCE)
for scanner.Scan() {
    obj, err := PARSE_JSON_INTO_yourObject(scanner.Text())
    if err != nil {
       // something
    }
    yourCollection = append(yourCollection, obj)
}
if err := scanner.Err(); err != nil {
    fmt.Fprintln(os.Stderr, "reading standard input:", err)
}
0 голосов
/ 15 мая 2018

Предполагая, что ваши данные на самом деле представляют собой серию действительных документов JSON, используйте json.Decoder для их декодирования:

package main

import (
    "encoding/json"
    "fmt"
    "io"
    "log"
    "strings"
)

var input = `
{"foo": "bar"}
{"foo": "baz"}
`

type Doc struct {
    Foo string
}

func main() {
    dec := json.NewDecoder(strings.NewReader(input))
    for {
        var doc Doc

        err := dec.Decode(&doc)
        if err == io.EOF {
            // all done
            break
        }
        if err != nil {
            log.Fatal(err)
        }

        fmt.Printf("%+v\n", doc)
    }
}

Playground: https://play.golang.org/p/ANx8MoMC0yq

Если ваш ввод действительно соответствует тому, что вы показали в вопросе, это не JSON, и вам нужно написать собственный анализатор.

0 голосов
/ 15 мая 2018

Кажется, что каждая строка - это собственный объект json.

Вы можете получить следующий код, который структурирует этот вывод в правильный json:

package main

import (
    "fmt"
    "strings"
)

func main() {
    base := `{"trolo":"lolo"}
{"trolo2":"lolo2"}`

    delimited := strings.Replace(base, "\n", ",", -1)

    final := "[" + delimited + "]"
    fmt.Println(final)
}

Теперь вы можете использовать библиотеку encoding/json на final.

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