Bagaimana untuk Unmarshal JSON dengan Pengendalian Teg Tersuai untuk Perwakilan Rentetan?

Linda Hamilton
Lepaskan: 2024-10-31 08:37:29
asal
343 orang telah melayarinya

How to Unmarshal JSON with Custom Tag Handling for String Representation?

Menyahmarshal JSON dengan Pengendalian Teg Tersuai

Apabila cuba menyahmarshal JSON ke dalam struct, anda mungkin perlu mengendalikan medan dengan teg tersuai secara berbeza . Artikel ini meneroka isu di mana medan dalam struct mempunyai teg yang menunjukkan bahawa ia harus dibongkar sebagai rentetan.

Masalah:

Pertimbangkan rentetan JSON dan rentetan struct yang sepadan:

<code class="json">{
  "I": 3,
  "S": {
    "phone": {
      "sales": "2223334444"
    }
  }
}</code>
Salin selepas log masuk
<code class="go">type A struct {
  I int64
  S string `sql:"type:json"`
}</code>
Salin selepas log masuk

Matlamatnya adalah untuk menyahmarshal medan "S" sebagai rentetan, bukannya struct.

Penyelesaian:

Menggunakan Antara Muka Marshaler/Unmarshaler:

Go menyediakan cara untuk mengatasi tingkah laku marshaler dan unmarshaler JSON lalai dengan melaksanakan antara muka Marshaler dan Unmarshaler untuk jenis tersuai. Dalam kes ini, cipta jenis baharu yang dipanggil RawString dan laksanakan fungsi ini:

<code class="go">type RawString string

func (m *RawString) MarshalJSON() ([]byte, error) {
  return []byte(*m), nil
}

func (m *RawString) UnmarshalJSON(data []byte) error {
  if m == nil {
    return errors.New("RawString: UnmarshalJSON on nil pointer")
  }
  *m += RawString(data)
  return nil
}</code>
Salin selepas log masuk

Memohon pada Struct:

Ubah suai struct A untuk menggunakan jenis RawString untuk medan "S":

<code class="go">type A struct {
  I int64
  S RawString `sql:"type:json"`
}</code>
Salin selepas log masuk

Dengan pelaksanaan ini, apabila JSON dinyahmarselkan ke dalam struct A, medan "S" akan dinyahmarshall sebagai rentetan, mengekalkan perwakilan JSON asalnya.

Contoh Penggunaan:

<code class="go">const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

func main() {
  a := A{}
  err := json.Unmarshal([]byte(data), &a)
  if err != nil {
    log.Fatal("Unmarshal failed:", err)
  }
  fmt.Println("Done", a)
}</code>
Salin selepas log masuk

Output:

<code class="text">Done {3 {"phone": {"sales": "2223334444"}}}</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Unmarshal JSON dengan Pengendalian Teg Tersuai untuk Perwakilan Rentetan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!