> 백엔드 개발 > Golang > JSON을 Go 인터페이스로 마샬링하고{} 이를 특정 유형으로 동적으로 변환하려면 어떻게 해야 하나요?

JSON을 Go 인터페이스로 마샬링하고{} 이를 특정 유형으로 동적으로 변환하려면 어떻게 해야 하나요?

Patricia Arquette
풀어 주다: 2024-12-20 21:28:14
원래의
725명이 탐색했습니다.

How Can I Marshal JSON into a Go Interface{} and Dynamically Convert it to a Specific Type?

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

복잡한 데이터 구조를 처리할 때 JSON을 인터페이스로 마샬링해야 하는 경우가 많습니다.{} 유연성과 다형성을 가능하게 합니다. 이 문서에서는 JSON을 인터페이스로 마샬링하고{} 필드 값에 따라 특정 유형으로 동적으로 변환하려는 특정 시나리오에 대한 솔루션을 제공합니다.

문제 설명

다음 상황을 생각해 보세요. Data라는 인터페이스 필드가 있는 메시지 유형이 있습니다.{} 또한 데이터 필드의 특정 변형을 나타내는 CreateMessage 유형도 있습니다. 명령(이 경우 "create")과 CreateMessage 유형과 일치하는 데이터가 모두 포함된 JSON 문자열을 역마샬링할 때 데이터가 인터페이스로 남아 있는 문제가 발생합니다{}.

해결책

이 문제를 해결하려면 Go의 유형 시스템과 JSON의 유연성을 활용해야 합니다. 원래 메시지 유형을 포함하고 Data라는 RawMessage 필드를 추가하는 새로운 구조체 유형인 Message를 정의합니다. RawMessage는 인코딩/json 패키지에서 제공하는 특수 유형으로, 유형 정보를 잃지 않고 임의의 JSON 데이터를 저장할 수 있습니다.

type Message struct {
    Cmd    string
    Data   json.RawMessage
}
로그인 후 복사

다음으로 데이터 필드의 각 변형에 대한 구조체 유형을 정의합니다. 사례, CreateMessage:

type CreateMessage struct {
    Conf map[string]int
    Info map[string]int
}
로그인 후 복사

이제 비마샬링 코드에서 Cmd 필드의 값을 켜고 데이터를 적절한 구체적으로 디코딩할 수 있습니다. type:

switch m.Cmd {
case "create":
    var cm CreateMessage
    if err := json.Unmarshal(m.Data, &cm); err != nil {
        log.Fatal(err)
    }
    fmt.Println(m.Cmd, cm.Conf, cm.Info)
default:
    log.Fatal("bad command")
}
로그인 후 복사

이 접근 방식을 사용하면 JSON을 인터페이스로 비정렬화하는 동시에 나중에 알려진 값을 기반으로 특정 유형으로 변환하는 기능을 유지할 수 있습니다.

위 내용은 JSON을 Go 인터페이스로 마샬링하고{} 이를 특정 유형으로 동적으로 변환하려면 어떻게 해야 하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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