>백엔드 개발 >Golang >Go에서 복잡한 자기 참조 JSON을 어떻게 역마샬링하나요?

Go에서 복잡한 자기 참조 JSON을 어떻게 역마샬링하나요?

Linda Hamilton
Linda Hamilton원래의
2024-12-16 09:29:09481검색

How to Unmarshal Complex, Self-Referential JSON in Go?

자기 참조 구조체 요소를 사용하여 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": ""
                }
            }
        ]
    }
}]

이 JSON을 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"`
}

그러나 JSON 문자열을 이 구조체의 슬라이스로 역마샬링하려고 시도하면 빈 슬라이스가 생성됩니다.

문제는 JSON 입력이 구조체가 아니라는 사실에 있습니다. DBS 구조체의 조각. 대신 여기에는 또 다른 JSON 개체 래퍼가 포함되어 있으며 DBS 값은 "db" 속성에 속합니다. 또한 "복제본" 속성에는 다양한 키를 보유하는 객체가 포함된 JSON 배열이 포함되어 있으며 이는 DBS 구조체로도 표시될 수 있습니다.

이 JSON을 완전히 모델링하려면 지도와 같은 동적 유형이 필요합니다. 우리에게 필요한 유형은 맵 조각을 나타내는 []map[string]DBS입니다. 맵 키는 모든 속성 이름을 모델링할 수 있으며 값은 DBS 구조체로 모델링된 JSON 개체입니다.

다음 예에서는 이 유형을 사용하여 JSON 입력을 완전히 구문 분석하는 방법을 보여줍니다.

import (
    "encoding/json"
    "fmt"
)

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"`
}

func main() {
    var dbs []map[string]DBS
    if err := json.Unmarshal([]byte(src), &dbs); err != nil {
        panic(err)
    }
    fmt.Printf("%+v", dbs)
}

출력:

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

첫 번째 수준은 항상 "db"이며 추가 모델링이 가능하며 포인터로 전환할 수 있습니다. 가독성을 향상시킵니다.

JSON 입력의 중첩과 구조를 이해함으로써 데이터를 정확하게 나타내는 사용자 정의 구조체로 효과적으로 역정렬화할 수 있습니다.

위 내용은 Go에서 복잡한 자기 참조 JSON을 어떻게 역마샬링하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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