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