태그된 필드를 사용하여 JSON을 역마샬링하는 방법
JSON을 구조체로 역마샬링할 때 특정 필드가 처리되는 방법을 지정해야 할 수 있습니다. 이를 위해 구조체 필드에 태그를 추가하여 역마샬링 프로세스에 추가 정보를 제공할 수 있습니다.
JSON 필드를 태그가 있는 구조체 필드로 문자열로 역마샬링해야 하는 시나리오에서 리플렉션을 사용하여 간단한 솔루션을 구현할 수 있습니다.
<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>
그러나 Go에서는 리플렉션이 필요 없는 보다 우아한 접근 방식을 사용할 수 있습니다.
<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>
위 내용은 Go에서 태그가 지정된 필드를 사용하여 JSON 데이터를 비정렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!