Ich habe versucht, meine Go-Map mit encoding/json
Marshal in eine JSON-Zeichenfolge zu konvertieren , aber es entstand eine leere Zeichenfolge.
Hier ist mein 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)
}
Meine Ausgabe ist:
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}]
[]
Ich weiß wirklich nicht, wo ich falsch liege. Danke für Ihre Hilfe.
Antworten:
Wenn Sie den Fehler abgefangen hätten, hätten Sie Folgendes gesehen:
Die Sache ist, dass Sie in JSON keine Ganzzahlen als Schlüssel verwenden können. es ist verboten. Stattdessen können Sie diese Werte vorher in Zeichenfolgen konvertieren, z. B. mit
strconv.Itoa
.Weitere Informationen finden Sie in diesem Beitrag: https://stackoverflow.com/a/24284721/2679935
quelle
Es sagt Ihnen tatsächlich, was falsch ist, aber Sie haben es ignoriert, weil Sie den zurückgegebenen Fehler nicht überprüft haben
json.Marshal
.json: unsupported type: map[int]main.Foo
Die JSON-Spezifikation unterstützt nichts außer Zeichenfolgen für Objektschlüssel, während Javascript nicht pingelig ist, es ist immer noch illegal.
Sie haben zwei Möglichkeiten:
1 Verwenden Sie
map[string]Foo
den Index und konvertieren Sie ihn in einen String (z. B. mit fmt.Sprint):2 Verwenden Sie einfach ein Slice (Javascript-Array):
playground
quelle
Da diese Frage gestellt / zuletzt beantwortet wurde, wurde die Unterstützung für Nicht-String-Schlüsseltypen für Karten für json Marshal / UnMarshal durch die Verwendung der TextMarshaler- und TextUnmarshaler- Schnittstellen hier hinzugefügt . Sie könnten diese Schnittstellen einfach für Ihre Schlüsseltypen implementieren und dann
json.Marshal
wie erwartet funktionieren.Ausgabe:
quelle