>백엔드 개발 >Golang >동적 유형을 사용하여 Go에서 자체 참조 JSON 문자열을 역마샬링하는 방법은 무엇입니까?

동적 유형을 사용하여 Go에서 자체 참조 JSON 문자열을 역마샬링하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-25 13:13:09137검색

How to Unmarshal a Self-Referential JSON String in Go with a Dynamic Type?

자기 참조 요소를 사용하여 JSON 문자열을 구조체로 역마샬링

Go에서 자체 참조 요소를 사용하여 JSON 문자열을 구조체로 역마샬링 참조 요소는 어려울 수 있습니다. 이 문제를 효과적으로 해결하기 위한 구체적인 예와 솔루션을 살펴보겠습니다.

JSON 입력 및 구조체 정의

다음 JSON 입력을 고려하세요.

[{
    "db": {
        "url": "mongodb://localhost",
        "port": "27000",
        "uname": "",
        "pass": "",
        "authdb": "",
        "replicas": [
            {
                "rs01": {
                    "url":"mongodb://localhost",
                    "port": "27001",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            },
            {
                "rs02": {
                    "url":"mongodb://localhost",
                    "port": "27002",
                    "uname": "",
                    "pass": "",
                    "authdb": ""
                }
            }
        ]
    }
}]

그리고 해당 Go struct:

type DBS struct {
    URL      string   `json:"url"`
    Port     string   `json:"port"`
    Uname    string   `json:"uname"`
    Pass     string   `json:"pass"`
    Authdb   string   `json:"authdb"`
    Replicas []DBS     `json:"replicas"`
}

함수 및 출력 비정렬화

제공된 함수 loadConfigs()는 JSON 문자열을 DBS 구조체 조각으로 역마샬링하려고 시도합니다.

func loadConfigs() []DBS {
    var config []DBS
    raw, err := ioutil.ReadFile("./config.json")
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
    }

    json.Unmarshal(raw, &config)
    return config
}

그러나 이렇게 하면 빈 슬라이스 []DBS{가 생성됩니다. 입력은 DBS 구조체의 조각이 아니라 객체 배열을 포함하는 JSON 객체 래퍼입니다.

해결책: 동적 유형으로 매핑

JSON 입력을 완전히 설명하려면 , 지도와 같은 동적 유형이 필요합니다. 업데이트된 유형 정의는 다음과 같습니다.

type DBSReplicated struct {
    DB *DBS `json:"db"`
}
type DBS struct {
    URL      string            `json:"url"`
    Port     string            `json:"port"`
    Uname    string            `json:"uname"`
    Pass     string            `json:"pass"`
    Authdb   string            `json:"authdb"`
    Replicas []map[string]*DBS `json:"replicas"`
}

이 새로운 유형을 사용하면 JSON 입력을 정확하게 구문 분석할 수 있습니다.

var dbs []*DBReplicated
if err := json.Unmarshal([]byte(src), &dbs); err != nil {
    panic(err)
}

db := dbs[0].DB
fmt.Printf("%+v\n", db)
for _, dbs := range db.Replicas {
    for name, replica := range dbs {
        fmt.Printf("%s: %+v\n", name, replica)
    }
}

출력

&{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:0x10538200] map[rs02:0x10538240]]}
rs01: &{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}
rs02: &{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}

키 포인트

  • 지도 유형을 사용하여 동적 JSON 입력을 모델링합니다.
  • JSON 태그 속성 이름의 올바른 구문에 주의하세요.
  • 포인터 사용을 고려하세요. 중첩된 구조체를 허용하려면 구조체에서

위 내용은 동적 유형을 사용하여 Go에서 자체 참조 JSON 문자열을 역마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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