Lorsque vous traitez des messages JSON contenant différents types de données, une approche courante peut impliquer de démarshaler les données dans une carte générique[ string]interface{} pour inspecter la clé et tenter de convertir la valeur en structures spécifiques. Cependant, cette approche peut conduire à un double démarshalage inutile.
Dans le contexte de Go, il existe une solution plus efficace pour démarshaler partiellement les données JSON dans un json.RawMessage au lieu d'une interface{}. Ceci est réalisé en déclarant la carte comme :
var myMap map[string]json.RawMessage
Lorsqu'il s'agit de convertir les valeurs en structures spécifiques, l'étape de marshaling/unmarshaling peut être éliminée. Par exemple, dans votre cas, vous effectuiez un casting vers votre structure "Ack" en utilisant :
ackjson, err := json.Marshal(v) if err != nil { fmt.Println("marshal error: ", err) } err = json.Unmarshal(ackjson, &myAck) if err != nil { fmt.Println("unmarshal error", err) }
Au lieu de cela, cela peut être simplifié en :
err = json.Unmarshal(v, &myAck)
Cette approche évite le démarshaling redondant étape, rendant l'analyse plus efficace.
Voici une version mise à jour de votre code qui intègre ceci optimisation :
package main import ( "encoding/json" "fmt" ) type Ping struct { Ping string `json:"ping"` } type Ack struct { Messages []Message `json:"messages"` } type Message string func main() { testJSON := []byte(`{"ack":{"messages":["Hi there","Hi again"]}}`) var myAck = Ack{} var myMap map[string]json.RawMessage err := json.Unmarshal(testJSON, &myMap) if err != nil { fmt.Println("error unmarshalling: ", err) } for k, v := range myMap { fmt.Printf("key: %s, value: %s \n", k, v) switch k { case "ping": fmt.Println(k, " is a ping", v) case "ack": fmt.Println(k, " is an ack containing a message list") err = json.Unmarshal(v, &myAck) if err != nil { fmt.Println("unmarshal error", err) } else { fmt.Println("New ack object: ", myAck) } default: fmt.Printf("%s is of a type (%T) I don't know how to handle", k, v) } } }
En utilisant json.RawMessage et en éliminant le démarshaling inutile, vous pouvez améliorer les performances de votre analyse JSON sans compromettre la fonctionnalité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!