Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyahmarshal Data JSON dengan Medan Berteg dalam Go?

Bagaimana untuk Menyahmarshal Data JSON dengan Medan Berteg dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-10-30 08:28:27640semak imbas

How to Unmarshal JSON Data with Tagged Fields in Go?

Cara Menyahmarshal JSON dengan Medan Berteg

Apabila menyahmarshall JSON ke dalam struct, mungkin perlu menentukan cara medan tertentu dikendalikan. Untuk melakukan ini, teg boleh ditambah pada medan struct untuk memberikan maklumat tambahan kepada proses unmarshaling.

Dalam senario di mana anda perlu menyahmarshal medan JSON sebagai rentetan ke dalam medan struct dengan tag, a penyelesaian mudah menggunakan refleksi boleh dilaksanakan:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "log"
    "reflect"
)

type A struct {
    I int64
    S string `sql:"type:json"`
}

const data = `{
    "I": 3,
    "S": {
        "phone": {
            "sales": "2223334444"
        }
    }
}`

func main() {
    var a A
    err := json.Unmarshal([]byte(data), &a)
    if err != nil {
        log.Fatal("Unmarshal failed", err)
    }

    rt := reflect.TypeOf(a)
    rv := reflect.ValueOf(&a)
    for i := 0; i < rt.NumField(); i++ {
        f := rt.Field(i)
        if f.Tag.Get("json") != "" {
            fv := rv.Elem().Field(i)
            fv.SetString(string(fv.Bytes()))
        }
    }

    fmt.Println("Done", a)
}</code>

Walau bagaimanapun, pendekatan yang lebih elegan tersedia dalam Go yang menghilangkan keperluan untuk refleksi:

<code class="go">package main

import (
    "encoding/json"
    "fmt"
    "log"
)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

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

Atas ialah kandungan terperinci Bagaimana untuk Menyahmarshal Data JSON dengan Medan Berteg 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