2017-02-01 6 views
-1

J'ai un service RESTful qui renvoie une réponse similaire à montrer ci-dessous:Json modèle de type unmarshal dans golang

"Basket" : { 
    "Count": 1, 
    "Fruits": {[ 
    { 
     "Name":"Mango", 
     "Season":"Summer" 
    }, 
    { 
     "Name":"Fig", 
     "Season":"Winter"} 
    ]} 
} 

Je suis en train de créer Go modèle lang pour désorganiser le contenu. Voici le code que j'ai essayé:

type Response struct { 
    Count int 
    Fruits []Fruit 
} 

type Fruit struct { 
    Name string 
    Season string 
} 

Mais quand je maréchal l'objet Response dans mon code de test, je ne vois pas JSON similaire. (https://play.golang.org/p/EGKqfbwFvW) données Marshalled apparaît toujours comme:

{ 
    "Count":100, 
    "Fruits":[ 
    {"Name":"Mango","Season":"Summer"}, 
    {"Name":"Fig","Season":"Winter"} 
    ] 
} 

Notez les fruits qui apparaissent sous forme de tableau [] et non {[]} JSON d'origine. Comment puis-je modéliser des structures dans Golang pour cette réponse?

+5

Ce n'est pas valide JSON. Les fruits doivent être soit un tableau ou un nom: paire de valeurs. –

Répondre

1

Votre modèle est tout à fait correct et valide, mais l'objet JSON est pas. "Fruits" n'a pas de nom s'il doit s'agir d'une paire valeur/clé ou doit être entouré de [] et non de {}.

JSON obj doit être formaté comme ceci:

{ 
    "Basket" : { 
    "Count": 1, 
    "Fruits": [ 
     { 
     "Name":"Mango", 
     "Season":"Summer" 
     }, 
     { 
     "Name":"Fig", 
     "Season":"Winter" 
     } 
    ] 
    } 
} 

Et effectivement JSON invalide ne devrait pas travailler https://play.golang.org/p/yoW7t4NfI7

+0

Vous êtes sur, le JSON que je consomme provient d'un tiers et n'est pas valide. Je passe en XML et ma structure fonctionne parfaitement (c'est pourquoi j'aime Go, la transition est juste 2 changement de ligne). J'ai également validé avec json.RawMessage. Json n'est pas censé avoir "[" après "{". – sukkad

1

Je voudrais faire de 'Baskets' une structure dans 'Response', créer une structure 'BasketsData' et lui donner tous les labels.

type Fruit struct { 
    Name string `json:"Name"` 
    Season string `json:"Season"` 
} 

type BasketData struct { 
    Count int  `json:"Count"` 
    Fruits []Fruit `json:"Fruits"` 
} 

type Response struct { 
    Basket BasketData `json:"Basket"` 
} 

De cette façon, vous obtiendrez une réponse JSON de haut niveau lorsque vous marshall il.

fruitmania := []Fruit{{Name: "Mango", Season: "Summer"}, 
         {Name: "Fig", Season: "Winter"}} 
basket := Response{BasketData{Count: 100, Fruits: fruitmania}} 

b, _ := json.Marshal(basket) 
fmt.Println(string(b)) 

checkit-checkit sur: https://play.golang.org/p/TuUwBLs_Ql

+0

Cela ne résout pas le problème de Fruits apparaissant en tant que tableau ** [] ** et non ** {[]} **. La sortie devrait avoir "Fruits": {[{"Nom": "Mango", "Saison": "Été"}, {"Nom": "Fig", "Saison": "Hiver"}}} – sukkad

+0

@sukkad c'est pas valide JSON –