>  기사  >  백엔드 개발  >  \"json\" 태그가 지정된 필드가 있는 구조체로 JSON을 역마샬링하는 방법은 무엇입니까?

\"json\" 태그가 지정된 필드가 있는 구조체로 JSON을 역마샬링하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-02 00:02:02176검색

How to Unmarshal JSON into a Struct with a Field Tagged with

"json" 태그가 지정된 필드가 있는 구조체로 JSON 역마샬링

JSON을 구조체로 역마샬링하려고 하면 특정 필드에 "json" 태그. JSON 데이터가 구조체 내에서 원하는 문자열 형식으로 올바르게 변환되도록 하려면 이 태그를 특수 처리해야 합니다.

제공된 예에서 구조체 A에는 sql:"type:json" 태그가 지정된 필드 S가 있습니다. 목표는 제공된 JSON 데이터의 "S" 값을 A 구조체 내의 문자열 형식으로 역마샬링하는 것입니다.

처음에는 필드 태그에 "json 문자열이 포함되어 있는지 확인하기 위해 리플렉션을 사용하는 것을 고려했을 수 있습니다. " 그런 다음 JSON 데이터를 해당 필드에 문자열로 역마샬링합니다. 그러나 더 효율적이고 우아한 접근 방식은 Go의 표준 라이브러리 기능을 사용하는 것입니다.

사용자 정의 유형 및 마샬/비정렬 메서드 사용

이를 달성하는 한 가지 방법은 사용자 정의 유형 RawString을 정의하고 구현하는 것입니다. 이에 대한 MarshalJSON 및 UnmarshalJSON 메서드입니다. 이러한 메소드는 JSON 데이터가 각각 인코딩 및 디코딩되는 방식을 제어하는 ​​방법을 제공합니다.

이 예에서 RawString 유형은 문자열 값을 래핑합니다. MarshalJSON 메서드는 문자열 값을 바이트 슬라이스로 반환하는 반면 UnmarshalJSON 메서드는 수신된 데이터를 기존 RawString에 추가합니다.

JSON 마샬링 및 언마샬링

다음 단계는 A를 정의하는 것입니다. I 필드(64비트 정수)와 RawString 유형의 S 필드를 포함하는 구조체입니다.

이러한 사용자 정의 유형과 메서드를 사용하면 제공된 JSON 데이터를 A 구조체로 역마샬링할 수 있습니다. 다음 Go 코드는 이를 보여줍니다.

<code class="go">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>

이 접근 방식을 사용하면 JSON 데이터를 "json" 태그가 지정된 필드가 있는 구조체로 효과적으로 역마샬링하고 원래 문자열 형식을 유지할 수 있습니다.

위 내용은 \"json\" 태그가 지정된 필드가 있는 구조체로 JSON을 역마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.