Intenté convertir mi mapa Go en una cadena json con encoding/json
Marshal, pero resultó en una cadena vacía.
Aquí está mi código:
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)
}
Mi salida es:
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}]
[]
Realmente no sé dónde me equivoco. Gracias por tu ayuda.
Respuestas:
Si hubiera detectado el error, habría visto esto:
El caso es que no puede usar números enteros como claves en JSON; está prohibido. En su lugar, puede convertir estos valores en cadenas de antemano, por ejemplo, utilizando
strconv.Itoa
.Consulte esta publicación para obtener más detalles: https://stackoverflow.com/a/24284721/2679935
fuente
En realidad, le dice qué está mal, pero lo ignoró porque no verificó el error devuelto
json.Marshal
.json: unsupported type: map[int]main.Foo
La especificación JSON no admite nada excepto cadenas para claves de objeto, mientras que javascript no será exigente al respecto, sigue siendo ilegal.
Tienes dos opciones:
1 Utilice
map[string]Foo
y convierta el índice en una cadena (utilizando fmt.Sprint, por ejemplo):2 Simplemente use un segmento (matriz javascript):
playground
fuente
Desde que se hizo esta pregunta / se respondió por última vez, se ha agregado soporte para tipos de claves que no son cadenas para mapas para json Marshal / UnMarshal mediante el uso de las interfaces TextMarshaler y TextUnmarshaler aquí . Simplemente podría implementar estas interfaces para sus tipos de clave y luego
json.Marshal
funcionaría como se esperaba.Salida:
fuente