Reflection으로 JSON 역마샬링 사용자 정의
Go에서 JSON을 구조체로 역마샬링하는 것은 간단한 프로세스입니다. 그러나 json:"some_field"와 같은 사용자 정의 태그가 있는 필드를 처리할 때 표준 역정렬화 메커니즘으로는 충분하지 않을 수 있습니다.
이 시나리오를 처리하는 한 가지 접근 방식은 리플렉션을 사용하는 것입니다. 리플렉션을 사용하여 구조체의 필드를 검사하면 필드에 특정 태그가 있는지 확인할 수 있고, 그렇다면 그에 따라 언마샬링을 처리할 수 있습니다.
이 특별한 경우에는 json 태그가 있는 필드가 다음과 같은지 확인하려고 합니다. 있는 그대로 문자열 필드로 비정렬화됩니다. 이를 통해 Go 구조체 내에서 JSON 개체 또는 배열을 처리할 수 있습니다.
예시 시나리오
다음 JSON 데이터와 Go 구조체를 고려하세요.
{
"I": 3,
"S": {
"phone": {
"sales": "2223334444"
}
}
}
type A struct {
I int64
S string `sql:"type:json"`
}
우리의 목표는 중첩된 JSON 구조를 유지하면서 "S" 필드를 문자열로 역마샬링하는 것입니다.
Reflection을 사용한 솔루션
다음 코드는 Reflection을 사용하여 이를 달성하는 방법을 보여줍니다.
func main() {
a := A{}
// Unmarshal the JSON data into a byte slice
var data []byte
// Iterate over the fields of the struct
typ := reflect.TypeOf(a)
val := reflect.ValueOf(a)
for i := 0; i 이 접근 방식에서는 리플렉션을 사용하여 구조체의 각 필드를 수동으로 검사하여 "json" 태그가 있는지 확인합니다. 그렇다면 JSON 데이터를 문자열로 필드에 역마샬링합니다.
Custom Marshaler 및 Unmarshaler를 사용한 대체 솔루션
또 다른 옵션은 사용자 정의 유형을 구현하는 것입니다. json.Marshaler 및 json.Unmarshaler 인터페이스를 구현하는 RawString과 같은 것입니다. 이를 통해 역마샬링 프로세스에 대한 더 많은 유연성과 제어가 가능합니다.
이 접근 방식은 다음 코드에서 설명됩니다.
// 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)
}
자체 유형을 구현함으로써 역마샬링 프로세스를 사용자 정의하고 반영의 필요성을 피하여 더 깨끗하고 효율적인 솔루션을 얻을 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3