Lors du traitement des réponses JSON, il peut être nécessaire de conserver certains objets imbriqués sous forme de chaînes brutes ou de tableaux d'octets au lieu de les faire analyser dans des structures Go. Pour résoudre ce problème, nous allons explorer une solution utilisant le type json.RawMessage du package encoding/json.
Dans votre scénario spécifique, le JSON suivant :
{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }
devait être désorganisé dans une structure Go avec un champ ID de type int64 et un champ Foo de type []byte. L'erreur que vous avez rencontrée, « json : impossible de transformer l'objet en une valeur Go de type []uint8 », indique que le processus de désorganisation tentait d'analyser l'objet foo en une valeur Go, ce qui n'est pas un comportement prévu.
Le type json.RawMessage fournit une solution à ce problème. Comme l'indique sa documentation, il s'agit d'un « objet JSON codé brut » qui peut être utilisé pour retarder le décodage JSON ou précalculer un encodage JSON. En utilisant json.RawMessage, vous pouvez conserver efficacement l'objet foo en tant que tableau d'octets bruts dans votre structure Go :
import ( "encoding/json" "fmt" ) type Bar struct { ID int64 `json:"id"` Foo json.RawMessage `json:"foo"` } func main() { var jsonStr = []byte(`{ "id" : 15, "foo" : { "foo": 123, "bar": "baz" } }`) var bar Bar err := json.Unmarshal(jsonStr, &bar) if err != nil { panic(err) } fmt.Printf("%+v\n", bar) }
Sortie :
{Id:15 Foo:[123 32 34 102 111 111 34 58 32 49 50 51 44 32 34 98 97 114 34 58 32 34 98 97 122 34 32 125]}
En tirant parti de json.RawMessage, vous pouvez maintenant, réussissez à démonter le JSON dans une structure Go qui traite l'objet foo comme un tableau d'octets.
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!