J'ai essayé de convertir ma carte Go en une chaîne json avec encoding/json
Marshal, mais cela a abouti à une chaîne vide.
Voici mon code:
package main
import (
"encoding/json"
"fmt"
)
type Foo struct {
Number int `json:"number"`
Title string `json:"title"`
}
func main() {
datas := make(map[int]Foo)
for i := 0; i < 10; i++ {
datas[i] = Foo{Number: 1, Title: "test"}
}
jsonString, _ := json.Marshal(datas)
fmt.Println(datas)
fmt.Println(jsonString)
}
Ma sortie est:
map[9:{1 test} 2:{1 test} 7:{1 test} 3:{1 test} 4:{1 test} 5:{1 test} 6:{1 test} 8:{1 test} 0:{1 test} 1:{1 test}]
[]
Je ne sais vraiment pas où je me trompe. Merci de votre aide.
Réponses:
Si vous aviez détecté l'erreur, vous auriez vu ceci:
Le fait est que vous ne pouvez pas utiliser des entiers comme clés dans JSON; c'est interdit. Au lieu de cela, vous pouvez convertir ces valeurs en chaînes au préalable, par exemple en utilisant
strconv.Itoa
.Voir cet article pour plus de détails: https://stackoverflow.com/a/24284721/2679935
la source
Il vous indique en fait ce qui ne va pas, mais vous l'avez ignoré car vous n'avez pas vérifié l'erreur renvoyée par
json.Marshal
.json: unsupported type: map[int]main.Foo
La spécification JSON ne prend en charge rien sauf les chaînes pour les clés d'objet, alors que javascript ne sera pas difficile à ce sujet, il est toujours illégal.
Vous avez deux options:
1 Utilisez
map[string]Foo
et convertissez l'index en chaîne (en utilisant fmt.Sprint par exemple):2 Utilisez simplement une tranche (tableau javascript):
playground
la source
Depuis que cette question a été posée / dernière réponse, la prise en charge des types de clés sans chaîne pour les cartes pour json Marshal / UnMarshal a été ajoutée via l'utilisation des interfaces TextMarshaler et TextUnmarshaler ici . Vous pouvez simplement implémenter ces interfaces pour vos types de clés, puis
json.Marshal
fonctionner comme prévu.Production:
la source