Heim >Backend-Entwicklung >Golang >Wie kann ich JSON effektiv in eine Schnittstelle{} in Go entmarshalieren?
Zu verstehen, wie man JSON in eine Schnittstelle entmarshaling{} ist eine entscheidende Fähigkeit für Go-Entwickler. In diesem Artikel gehen wir ein praktisches Beispiel durch, das die Fallstricke und Lösungen hervorhebt, die mit dem Unmarshaling von JSON in eine Struktur mit einem Interface{}-Feld verbunden sind.
Beachten Sie die folgenden Typdefinitionen:
type Message struct { Cmd string `json:"cmd"` Data interface{} `json:"data"` } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }
Angenommen eine JSON-Zeichenfolge, die eine Erstellungsnachricht darstellt, versuchen wir möglicherweise, sie in eine Nachricht zu dekodieren struct:
{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
import "encoding/json" var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`) var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) }
Bei der Untersuchung der nicht gemarshallten Nachrichtenstruktur stellen wir fest, dass das Datenfeld als Map[string]interface{} erhalten bleibt:
{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}
Um diese Einschränkung zu überwinden, wenden wir einen zweigleisigen Ansatz an Ansatz:
type Message struct { Cmd string `json:"cmd"` Data json.RawMessage } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }
Mit diesen Modifikationen können wir die Variantendaten basierend auf dem Befehl in den entsprechenden Strukturtyp dekodieren:
func main() { var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) } switch m.Cmd { case "create": var cm CreateMessage if err := json.Unmarshal([]byte(m.Data), &cm); err != nil { log.Fatal(err) } fmt.Println(m.Cmd, cm.Conf, cm.Info) default: log.Fatal("bad command") } }
Durch den Einsatz dieser Technik können wir Entmarshamren Sie die JSON-Daten erfolgreich in die Nachrichtenstruktur, wobei das Feld „Daten“ den Variantentyp „CreateMessage“ enthält. Eine vollständige Implementierung finden Sie im bereitgestellten Playground-Beispiel.
Das obige ist der detaillierte Inhalt vonWie kann ich JSON effektiv in eine Schnittstelle{} in Go entmarshalieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!