Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Unmarshal JSON dengan Pengendalian Teg Tersuai untuk Perwakilan Rentetan?

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

Linda Hamilton
Linda Hamiltonasal
2024-10-31 08:37:29420semak imbas

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>
<code class="go">type A struct {
  I int64
  S string `sql:"type:json"`
}</code>

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>

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>

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>

Output:

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

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!

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