Unmarschall-JSON-Datei mit mehreren JSON-Objekten (ungültige JSON-Datei) [Duplikat]
Ich habe eine JSON-Datei (file.json) mit folgendem Inhalt:
file.json:
{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}
Der Inhalt der Datei ist genau wie oben (nicht gültige JSON-Datei)
Ich möchte Daten in meinem Code verwenden, kann dies jedoch nicht aufheben
Antworten
Sie können die Zeichenfolge Zeile für Zeile lesen und die Zuordnung aufheben:
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)
}
}
Ausgabe:
JOB {Job:developer}
JOB {Job:taxi driver}
JOB {Job:police}
Beispiel
Was Sie haben, ist kein einzelnes JSON-Objekt, sondern eine Reihe von (nicht verwandten) JSON-Objekten. Sie können json.Unmarshal()etwas, das mehrere (unabhängige) JSON-Werte enthält, nicht aus dem Marshall entfernen.
Verwenden Sie json.Decoderdiese Option, um mehrere JSON-Werte (Objekte) einzeln aus einer Quelle zu dekodieren.
Zum Beispiel:
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"}`
Welche Ausgänge (probieren Sie es auf dem Go Playground ):
Decoded: {Job:developer}
Decoded: {Job:taxi driver}
Decoded: {Job:police}
Diese Lösung funktioniert auch dann, wenn Ihre JSON-Objekte mehrere Zeilen in der Quelldatei belegen oder wenn sich mehrere JSON-Objekte in derselben Zeile befinden.
Siehe verwandte: Ich habe die Ausgabe von exec.Command auf folgende Weise erhalten. Von dieser Ausgabe möchte ich Daten erhalten, die ich brauchte