fichier json unmarshal avec plusieurs objets json (fichier json non valide) [dupliquer]

Nov 20 2020

J'ai un fichier json (file.json) avec le contenu suivant:

file.json:

{"job": "developer"}
{"job": "taxi driver"}
{"job": "police"}

Le contenu du fichier est exactement comme ci-dessus (fichier json non valide)

Je veux utiliser des données dans mon code, mais je ne peux pas déprécier ceci

Réponses

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

Vous pouvez lire la chaîne ligne par ligne et la démarseler:

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

Production:

JOB {Job:developer}
JOB {Job:taxi driver}
JOB {Job:police}

Exemple

4 icza Nov 20 2020 at 15:55

Ce que vous avez n'est pas un seul objet JSON mais une série d'objets JSON (non liés). Vous ne pouvez pas utiliser json.Unmarshal()pour démarseler quelque chose qui contient plusieurs valeurs JSON (indépendantes).

Utilisez json.Decoderpour décoder plusieurs valeurs JSON (objets) à partir d'une source une par une.

Par exemple:

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"}`

Quelles sorties (essayez-le sur le Go Playground ):

Decoded: {Job:developer}
Decoded: {Job:taxi driver}
Decoded: {Job:police}

Cette solution fonctionne même si vos objets JSON occupent plusieurs lignes dans le fichier source ou s'il y a plusieurs objets JSON sur la même ligne.

Voir connexe: J'obtenais la sortie de la sortie exec.Command de la manière suivante. à partir de cette sortie, je veux obtenir les données dont j'avais besoin