JSON 데이터 작업에는 추가 처리를 위해 데이터를 구조체로 변환하는 작업이 포함되는 경우가 많습니다. 그러나 구조체에 역마샬링 프로세스에 영향을 미치는 사용자 정의 태그가 있는 필드가 포함되어 있으면 문제가 발생합니다. 이 문서에서는 Go의 리플렉션 기능을 사용하여 이러한 시나리오를 처리하는 방법을 보여줍니다.
이 특별한 상황에서 목표는 JSON 데이터를 해당 필드 중 하나에 태그가 있는 구조체로 역마샬링하는 것입니다. 이는 JSON 문자열로 처리되어야 함을 나타냅니다. 다음 예를 살펴보겠습니다.
<code class="go">const data = `{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }` type A struct { I int64 S string `sql:"type:json"` }</code>
이 경우 목표는 JSON의 "S" 필드를 문자열로 구조체 A에 역마샬링하는 것입니다.
Go는 사용자 정의 역마샬링 동작을 허용하는 내장 UnmarshalJSON 메서드를 제공합니다. 새로운 유형을 생성하고 MarshalJSON 및 UnmarshalJSON 메서드를 구현하면 원하는 결과를 얻을 수 있습니다.
<code class="go">import ( "encoding/json" "errors" "log" "fmt" ) // 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>
이 솔루션에서 RawString 유형은 MarshalJSON 및 UnmarshalJSON 메서드를 구현하여 JSON 데이터가 인코딩되는 방식을 제어하고 디코딩되어 기본적으로 비정렬화 중에 "S" 필드가 문자열로 처리될 수 있습니다.
Go의 반사 기능과 사용자 정의 비정렬화 방법을 활용하면 복잡한 JSON 비정렬화 시나리오를 처리할 수 있습니다. 필드에 특별한 처리가 필요한 특정 태그가 있는 경우에도 마찬가지입니다.
위 내용은 Go에서 사용자 정의 필드 태그를 사용하여 JSON 데이터를 어떻게 역마샬링합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!