Unmarschall-JSON-Datei mit mehreren JSON-Objekten (ungültige JSON-Datei) [Duplikat]

Nov 20 2020

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

Зелёный Nov 20 2020 at 16:00

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

4 icza Nov 20 2020 at 15:55

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