fichier json unmarshal avec plusieurs objets json (fichier json non valide) [dupliquer]
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
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
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