簡體   English   中英

在 Go 中解析多個 JSON 對象

[英]Parsing multiple JSON objects in Go

使用encoding/json包可以很容易地解析像下面這樣的對象。

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

我面臨的問題是當有多個像這樣從服務器返回的字典時:

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

這不能使用下面的代碼解析。

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

我正在嘗試解析 Common Crawl 數據(參見示例)。

我怎樣才能做到這一點?

假設您的輸入確實是一系列有效的 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)
    }
}

游樂場: https : //play.golang.org/p/ANx8MoMC0yq

如果您的輸入確實是您在問題中顯示的內容,那么這不是 JSON,您必須編寫自己的解析器。

似乎每一行都是它自己的 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)
}

您現在應該可以在final上使用encoding/json庫了。

另一種選擇是逐行解析每個傳入的行,然后將每個行添加到代碼集合(即切片)中,Go 為此提供了行掃描器

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)
}

您可以逐行從文件中讀取 ndjson 並解析它,然后對其應用邏輯操作。 在下面的示例中,我使用了一個 JSON 字符串數組,而不是從文件中讀取。

import (
    "encoding/json"
    "fmt"
)

type NestedObject struct {
    D string
    E string
}

type OuterObject struct {
    A string
    B string
    C []NestedObject
}

func main() {

    myJsonString := []string{`{"A":"1","B":"2","C":[{"D":"100","E":"10"}]}`, `{"A":"11","B":"21","C":[{"D":"1001","E":"101"}]}`}
    for index, each := range myJsonString {
        fmt.Printf("Index value [%d] is [%v]\n", index, each)
        var obj OuterObject
        json.Unmarshal([]byte(each), &obj)
        fmt.Printf("a: %v, b: %v, c: %v", obj.A, obj.B, obj.C)
        fmt.Println()
    }
}

輸出:

Index value [0] is [{"A":"1","B":"2","C":[{"D":"100","E":"10"}]}]
a: 1, b: 2, c: [{100 10}]
Index value [1] is [{"A":"11","B":"21","C":[{"D":"1001","E":"101"}]}]
a: 11, b: 21, c: [{1001 101}]

在 golang play 上試試

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM