Go에서 동적 키를 사용하여 YAML을 구문 분석하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-04 02:28:29
원래의
201명이 탐색했습니다.

How to Parse YAML with Dynamic Keys in Go?

Golang을 사용한 YAML의 동적 키 구문 분석

소개

YAML(YAML은 그렇지 않습니다. Markup Language)는 유연한 데이터 표현을 허용하는 널리 사용되는 데이터 직렬화 형식입니다. 그러나 언어가 정적으로 유형이 지정된 구조에 크게 의존하기 때문에 동적 키(즉, 다를 수 있는 키)를 사용하여 YAML 파일을 구문 분석하는 것은 Go에서 문제가 됩니다.

문제 설명

키가 다양한 버전(예: V1, V2, V3)을 나타내는 YAML 파일이 있습니다. 사용자는 자신이 지원하는 버전을 지정할 수 있으며, 키의 순서가 맞지 않거나 버전을 건너뛸 수도 있습니다. 이 YAML 파일을 Go 구조체로 구문 분석하려고 하지만 구조체의 필드가 동적 키와 일치해야 합니다.

잘못된 접근 방식

처음에는 YAML 구문 분석을 시도했습니다. 키가 루트 수준에 있을 것으로 예상하여 환경 구조체에 파일을 저장합니다. 그러나 루트 요소의 실제 유형은 환경 구조체에 대한 문자열(환경 이름을 나타냄)의 맵입니다.

솔루션

동적 키로 YAML을 구문 분석하려면 키를 구문 분석하고 올바른 구조체를 구성하는 구조체에서 사용자 지정 UnmarshalYAML 메서드를 사용해야 합니다. 이 경우 환경 구조체에는 루트를 맵으로 역마샬링한 다음 개별 환경을 구문 분석하는 UnmarshalYAML 메서드가 필요합니다.

코드 샘플

다음은 환경 구조체에 대한 사용자 정의 UnmarshalYAML 메서드:

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

이 메서드는 먼저 부울 필드 SkipHeaderValidation을 비정렬화합니다. 그런 다음 나머지 데이터를 MajorVersion 구조체에 대한 버전 이름 맵으로 역정렬화하려고 시도합니다. 그러나 마샬링되지 않은 데이터는 부울과 MajorVersion 구조체가 혼합되어 있기 때문에 yaml.TypeError가 발생합니다. 코드는 이 오류를 무시하고 마샬링되지 않은 버전 맵을 Environment 구조체의 Versions 필드에 할당합니다.

사용 예

사용자 정의 UnmarshalYAML 메서드를 사용하면 다음을 수행할 수 있습니다. 이제 YAML 데이터를 올바르게 역정렬화합니다.

<code class="go">var e map[string]Environment
if err := yaml.Unmarshal([]byte(data), &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,
            },
        },
    },
}
로그인 후 복사

이는 동적 키가 있는 YAML 파일을 Go 구조체로 성공적으로 구문 분석한 것을 보여줍니다.

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

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