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
Libérer: 2024-11-29 07:15:11
original
558 Les gens l'ont consulté

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" }
}
Copier après la connexion
type Bar struct {
  Id int64
  Foo []byte
}
Copier après la connexion

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

json: cannot unmarshal object into Go value of type []uint8
Copier après la connexion

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
}
Copier après la connexion

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)
}
Copier après la connexion

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]}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal