Maison >développement back-end >Golang >Comment gérer les objets JSON imbriqués sous forme de chaînes ou d'octets en Go ?

Comment gérer les objets JSON imbriqués sous forme de chaînes ou d'octets en Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-29 07:15:11656parcourir

How to Handle Nested JSON Objects as Strings or Bytes in Go?

Marshaling d'objets JSON imbriqués sous forme de chaînes ou d'octets

Lors du démarshaling de données JSON, il est souvent souhaitable de traiter les objets imbriqués comme des valeurs opaques, plutôt que de les analyser en types Go. Ceci peut être réalisé en utilisant le type RawMessage fourni par le package encoding/json.

Problème

Considérez la structure JSON et Go suivante :

{
  "id": 15,
  "foo": { "foo": 123, "bar": "baz" }
}
type Bar struct {
  Id int64
  Foo []byte
}

Tentative Unmarshal ce JSON dans la structure Bar donne les résultats suivants erreur :

json: cannot unmarshal object into Go value of type []uint8

Solution

Pour conserver l'objet imbriqué sous forme de chaîne ou de tranche d'octets, utilisez le type RawMessage :

type Bar struct {
  Id int64
  Foo json.RawMessage
}

Comme décrit dans la documentation , RawMessage est un objet JSON codé brut qui implémente à la fois Marshaler et Unmarshaler interfaces.

Exemple

Voici un exemple fonctionnel :

package main

import (
  "encoding/json"
  "fmt"
)

var jsonStr = []byte(`{
  "id": 15,
  "foo": { "foo": 123, "bar": "baz" }
}`)

type Bar struct {
  Id int64
  Foo json.RawMessage
}

func main() {
  var bar Bar

  if err := json.Unmarshal(jsonStr, &bar); err != nil {
    panic(err)
  }
  fmt.Printf("%+v", 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]}

Aire de jeux

[Aire de jeux lien](https://play.golang.org/p/L2yJj2e72dS)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn