> 백엔드 개발 > Golang > JSON 키가 구조체 필드 이름과 일치하지 않는 경우 Go에서 구조체를 슬라이스 맵으로 사용자 정의 역마샬링하려면 어떻게 해야 합니까?

JSON 키가 구조체 필드 이름과 일치하지 않는 경우 Go에서 구조체를 슬라이스 맵으로 사용자 정의 역마샬링하려면 어떻게 해야 합니까?

Patricia Arquette
풀어 주다: 2024-10-26 14:00:04
원래의
819명이 탐색했습니다.

How can I custom unmarshal a struct into a map of slices in Go when the JSON keys don't match the struct field names?

구조체를 슬라이스 맵으로 사용자 정의 역마샬링

JSON 데이터를 처리할 때 JSON 객체 내의 특정 요소를 데이터 구조에 맞는 필드입니다. 그러나 기본 JSON 역마샬링 메커니즘이 항상 이러한 요구 사항을 충족하는 것은 아닙니다. 여기가 사용자 지정 역마샬링이 작동하는 곳입니다.

제공된 예에는 양초 조각을 값으로 예상하는 맵 필드 쌍이 있는 구조체 OHLC_RESS가 있습니다. 그러나 초기 코드는 쌍 맵을 채우지 못합니다.

문제 이해

정렬화 해제 동작은 여러 요인으로 인해 발생합니다.

  1. JSON 개체 키가 일치하지 않습니다. 필드 이름을 구성합니다.
  2. 필드 이름 쌍은 역마샬러에 특별한 의미를 제공하지 않습니다.
  3. 마지막 필드는 해당 JSON 키(마지막)가 필드 이름과 일치하기 때문에 역마샬링됩니다.

맞춤형 언마샬링 솔루션

이러한 문제를 해결하려면 구조체 내에서 관련 메서드를 구현하여 json.Unmarshaler 인터페이스를 활용할 수 있습니다.

<code class="go">func (r *OHLC_RESS) UnmarshalJSON(d []byte) error {
    // Decode JSON object keys and values into raw messages.
    var obj map[string]json.RawMessage
    if err := json.Unmarshal(d, &obj); err != nil {
        return err
    }

    // Handle the "last" field.
    if last, ok := obj["last"]; ok {
        if err := json.Unmarshal(last, &r.Last); err != nil {
            return err
        }
        delete(obj, "last")
    }

    // Unmarshal the remaining elements into the Pair map.
    r.Pair = make(map[string][]Candles, len(obj))
    for key, val := range obj {
        cc := []Candles{}
        if err := json.Unmarshal(val, &cc); err != nil {
            return err
        }
        r.Pair[key] = cc
    }
    return nil
}</code>
로그인 후 복사

이 솔루션은 다음과 같습니다.

  1. 마지막 필드의 디코딩을 나머지 객체 값과 분리합니다.
  2. 문자열 키와 []Candles 값으로 맵을 생성하여 쌍을 저장합니다.
  3. 나머지 JSON 키와 값을 반복하여 각각을 캔들 조각으로 역마샬링하고 이를 쌍 맵에 저장합니다.

이 사용자 정의 역마샬링을 구현하면 특정 JSON 요소가 어떻게 표시되는지 제어할 수 있는 유연성을 얻을 수 있습니다. JSON 개체의 구조가 직접적으로 일치하지 않는 경우에도 원하는 데이터 구조에 매핑됩니다.

위 내용은 JSON 키가 구조체 필드 이름과 일치하지 않는 경우 Go에서 구조체를 슬라이스 맵으로 사용자 정의 역마샬링하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿