>백엔드 개발 >Golang >동적 필드 값을 기반으로 JSON을 Go 인터페이스로 역마샬링하는 방법은 무엇입니까?

동적 필드 값을 기반으로 JSON을 Go 인터페이스로 역마샬링하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-21 20:01:11594검색

How to Unmarshal JSON into Go Interfaces Based on a Dynamic Field Value?

Go에서 JSON을 인터페이스로 역마샬링

특정 필드에 따라 다양한 데이터 구조를 갖는 JSON 문자열이 있는 시나리오를 생각해 보세요. "cmd" 필드로. 이 JSON을 인터페이스 유형의 필드가 포함된 Go 구조체로 역마샬링하고 이를 "cmd" 값을 기반으로 하는 다양한 데이터 구조에 적용하려고 합니다.

해결책

이를 달성하려면 고정 필드가 있는 기본 구조체와 변형 데이터를 보관할 json.RawMessage 필드를 정의하세요. 그런 다음 각 변형에 대한 특정 구조체 유형을 생성하고 명령을 기반으로 이를 역정렬화합니다.

예:

type Message struct {
  Cmd string `json:"cmd"`
  Data      json.RawMessage
}  

type CreateMessage struct {
    Conf map[string]int `json:"conf"`
    Info map[string]int `json:"info"`
}  

func main() {
    var m Message
    if err := json.Unmarshal(data, &m); err != nil {
        log.Fatal(err)
    }
    switch m.Cmd {
    case "create":
        var cm CreateMessage
        if err := json.Unmarshal([]byte(m.Data), &cm); err != nil {
            log.Fatal(err)
        }
        fmt.Println(m.Cmd, cm.Conf, cm.Info)
    default:
        log.Fatal("bad command")
    }
}

이 예에서 메시지 구조체는 다음을 포함하는 전체 메시지 구조를 나타냅니다. 변형 데이터를 보관하는 "cmd" 필드와 json.RawMessage 필드. CreateMessage는 "create" 명령 변형을 나타내는 특정 구조체 유형입니다.

이 코드는 초기 JSON 문자열을 메시지 변수로 역마샬링한 다음 "cmd" 필드를 사용하여 역정렬화하고 인쇄할 특정 변형을 결정합니다.

위 내용은 동적 필드 값을 기반으로 JSON을 Go 인터페이스로 역마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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