Tentei converter meu mapa Go em uma string json com encoding/json
Marshal, mas resultou em uma string vazia.
Este é meu 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)
}
Minha saída é:
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 não sei onde estou errado. Obrigado pela ajuda.
Respostas:
Se você tivesse detectado o erro, teria visto o seguinte:
O fato é que você não pode usar inteiros como chaves em JSON; é proibido. Em vez disso, você pode converter esses valores em strings de antemão, por exemplo, usando
strconv.Itoa
.Veja esta postagem para mais detalhes: https://stackoverflow.com/a/24284721/2679935
fonte
Na verdade, ele informa o que está errado, mas você o ignorou porque não verificou o erro retornado de
json.Marshal
.json: unsupported type: map[int]main.Foo
A especificação JSON não oferece suporte a nada, exceto strings para chaves de objeto, embora o javascript não seja muito exigente quanto a isso, ainda é ilegal.
Você tem duas opções:
1 Use
map[string]Foo
e converta o índice em string (usando fmt.Sprint, por exemplo):2 Basta usar um slice (array javascript):
playground
fonte
Uma vez que esta pergunta foi feita / último respondeu: suporte para tipos não-chave corda para mapas para json Marshal / Unmarshal foi adicionado através do uso de TextMarshaler e TextUnmarshaler interfaces de aqui . Você poderia apenas implementar essas interfaces para seus tipos de chave e, a seguir
json.Marshal
, funcionaria conforme o esperado.Resultado:
fonte