Désassembler JSON dans Go sans double démarshalling
Dans Go, il est possible de faire face à une situation où vous devez analyser JSON dans diverses structures, mais un double désorganisation se produit, conduisant à une redondance. Cet article présente une solution qui implique de désassembler partiellement les données pour éviter la deuxième étape de désorganisation.
Comprendre le problème
Lorsque vous essayez d'analyser JSON dans des structures connues, un problème courant L'approche est :
Le Solution
Au lieu de convertir la valeur en interface{}, on peut la désorganiser dans un json.RawMessage. Cela désorganise partiellement les données et permet une désorganisation ultérieure vers des structures spécifiques en fonction de la valeur clé.
Exemple de code
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) } jsonAck, ok := myMap["ack"] if !ok { fmt.Println("key 'ack' not found") return } err = json.Unmarshal(jsonAck, &myAck) if err != nil { fmt.Println("unmarshal error", err) } else { fmt.Println("New ack object: ", myAck) } }
Dans ce code modifié, nous remplaçons la carte [string]interface{} avec map[string]json.RawMessage. Lors de la manipulation de la clé « ack », nous procédons au démarshaling directement vers la structure Ack, éliminant ainsi le besoin d'un double démarshalling.
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!