> 백엔드 개발 > Golang > 사용자 정의 언마샬러를 사용하여 Go에서 동적 키로 YAML을 구문 분석하는 방법은 무엇입니까?

사용자 정의 언마샬러를 사용하여 Go에서 동적 키로 YAML을 구문 분석하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-04 06:34:01
원래의
451명이 탐색했습니다.

How to Parse YAML with Dynamic Keys in Go Using a Custom Unmarshaler?

Go에서 동적 키를 사용하여 YAML 구문 분석

이 문제는 사용자가 정의한 API 버전에 따라 달라질 수 있는 키를 사용하여 YAML 파일을 구문 분석할 때 발생합니다. . 사용자는 필요에 따라 버전을 생략하거나 배열할 수 있습니다(예: V0, V2, V5).

환경 구조를 사용한 원래 접근 방식

초기 접근 방식에는 YAML을 다음과 같이 구문 분석하는 것이 포함됩니다. 환경 구조체. 그러나 구문 분석된 데이터의 실제 유형은 map[string]Environment입니다.

<code class="go">type Environment struct {
  SkipHeaderValidation  bool        `yaml:"skip-header-validation"`
  Version               map[string]MajorVersion
}</code>
로그인 후 복사

이 문제를 해결하려면 사용자 정의 Unmarshaler가 필요합니다.

Custom Unmarshaler for Environment

정적 키와 동적 키를 모두 구문 분석하는 환경 유형에 대한 사용자 정의 Unmarshaler 메서드를 생성합니다.

<code class="go">func (e *Environment) UnmarshalYAML(unmarshal func(interface{}) error) error {
    var params struct {
        SkipHeaderValidation bool `yaml:"skip-header-validation"`
    }
    if err := unmarshal(&amp;params); err != nil {
        return err
    }
    var versions map[string]MajorVersion
    if err := unmarshal(&amp;versions); err != nil {
        // Expect error here due to boolean to MajorVersion conversion
        if _, ok := err.(*yaml.TypeError); !ok {
            return err
        }
    }
    e.SkipHeaderValidation = params.SkipHeaderValidation
    e.Versions = versions
    return nil
}</code>
로그인 후 복사

수정된 구문 분석 및 출력

이제 구문 분석 코드를 수정하여 동적 키를 처리하고 궁극적으로 원하는 데이터 구조를 반환할 수 있습니다.

수정된 기본 함수

<code class="go">func main() {
    var e map[string]Environment
    if err := yaml.Unmarshal([]byte(data), &amp;e); err != nil {
        fmt.Println(err.Error())
    }
    fmt.Printf("%#v\n", e)
}</code>
로그인 후 복사

출력

이제 출력에는 그에 따라 구문 분석된 동적 키가 포함된 예상 데이터 구조가 반영됩니다.

map[string]main.Environment{
    "development": {
        SkipHeaderValidation: true,
        Versions:             {
            "V2": {
                Current:                "2.0.0",
                MimeTypes:              {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"},
                SkipVersionValidation:  false,
                SkipMimeTypeValidation: false,
            },
            "V1": {
                Current:                "1.0.0",
                MimeTypes:              {"application/vnd.company.jk.identity+json;", "application/vnd.company.jk.user+json;", "application/vnd.company.jk.role+json;", "application/vnd.company.jk.scope+json;", "application/vnd.company.jk.test+json;"},
                SkipVersionValidation:  true,
                SkipMimeTypeValidation: true,
            },
        },
    },
}
로그인 후 복사

위 내용은 사용자 정의 언마샬러를 사용하여 Go에서 동적 키로 YAML을 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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