Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengendalikan Objek JSON Bersarang sebagai Rentetan atau Bait dalam Go?

Bagaimana untuk Mengendalikan Objek JSON Bersarang sebagai Rentetan atau Bait dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-29 07:15:11662semak imbas

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

Marshaling Nested JSON Objects as Strings or Bytes

Apabila Menyahmarshall data JSON, selalunya wajar untuk menganggap objek bersarang sebagai nilai legap, dan bukannya menghuraikannya ke dalam jenis Go. Ini boleh dicapai menggunakan jenis RawMessage yang disediakan oleh pakej pengekodan/json.

Masalah

Pertimbangkan struct JSON dan Go berikut:

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

Percubaan untuk Unmarshal JSON ini ke dalam struct Bar menghasilkan perkara berikut ralat:

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

Penyelesaian

Untuk mengekalkan objek bersarang sebagai rentetan atau kepingan bait, gunakan jenis RawMessage:

type Bar struct {
  Id int64
  Foo json.RawMessage
}

Seperti yang diterangkan dalam dokumentasi , RawMessage ialah objek JSON yang dikodkan mentah yang melaksanakan kedua-dua Marshaler dan Unmarshaler antara muka.

Contoh

Berikut ialah contoh yang berfungsi:

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)
}

Output:

{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]}

Taman Permainan

[Taman Permainan pautan](https://play.golang.org/p/L2yJj2e72dS)

Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Objek JSON Bersarang sebagai Rentetan atau Bait dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn