nieważny plik json z wieloma obiektami json (nieprawidłowy plik json) [duplikat]
Mam plik json (file.json) z następującą zawartością:
file.json:
{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}
Zawartość pliku jest dokładnie taka sama jak powyżej (nieprawidłowy plik json)
Chcę użyć danych w moim kodzie, ale nie mogę tego Unmarshal
Odpowiedzi
Możesz czytać ciąg linia po linii i cofać to:
package main
import (
"bufio"
"encoding/json"
"fmt"
"strings"
)
type j struct {
Job string `json:"job"`
}
func main() {
payload := strings.NewReader(`{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}`)
fscanner := bufio.NewScanner(payload)
for fscanner.Scan() {
var job j
err := json.Unmarshal(fscanner.Bytes(), &job)
if err != nil {
fmt.Printf("%s", err)
continue
}
fmt.Printf("JOB %+v\n", job)
}
}
Wynik:
JOB {Job:developer}
JOB {Job:taxi driver}
JOB {Job:police}
Przykład
To, co masz, to nie pojedynczy obiekt JSON, ale seria (niepowiązanych) obiektów JSON. Nie można użyć json.Unmarshal()do cofnięcia odczytu czegoś, co zawiera wiele (niezależnych) wartości JSON.
Służy json.Decoderdo dekodowania wielu wartości JSON (obiektów) ze źródła jeden po drugim.
Na przykład:
func main() {
f := strings.NewReader(file)
dec := json.NewDecoder(f)
for {
var job struct {
Job string `json:"job"`
}
if err := dec.Decode(&job); err != nil {
if err == io.EOF {
break
}
panic(err)
}
fmt.Printf("Decoded: %+v\n", job)
}
}
const file = `{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}`
Które wyjścia (wypróbuj na Go Playground ):
Decoded: {Job:developer}
Decoded: {Job:taxi driver}
Decoded: {Job:police}
To rozwiązanie działa nawet wtedy, gdy obiekty JSON zajmują wiele wierszy w pliku źródłowym lub jeśli w tym samym wierszu znajduje się wiele obiektów JSON.
Zobacz powiązane: Otrzymywałem dane wyjściowe exec.Command w następujący sposób. z tego wyniku chcę uzyskać dane, których potrzebowałem