JSON을 인터페이스로 역마샬링하는 방법을 이해하는 것은{} Go 개발자에게 중요한 기술입니다. 이 문서에서는 JSON을 인터페이스{} 필드가 있는 구조체로 역마샬링하는 것과 관련된 함정과 해결 방법을 강조하는 실용적인 예를 살펴보겠습니다.
다음 유형 정의를 고려하세요.
type Message struct { Cmd string `json:"cmd"` Data interface{} `json:"data"` } type CreateMessage struct { Conf map[string]int `json:"conf"` Info map[string]int `json:"info"` }
생성 메시지를 나타내는 JSON 문자열이 주어지면 이를 메시지로 디코딩하려고 시도할 수 있습니다. struct:
{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}
import "encoding/json" var data = []byte(`{"cmd":"create","data":{"conf":{"a":1},"info":{"b":2}}`) var m Message if err := json.Unmarshal(data, &m); err != nil { log.Fatal(err) }
마샬링되지 않은 메시지 구조체를 조사한 결과 데이터 필드가 map[string]인터페이스로 남아 있음을 알 수 있습니다.{}:
{Cmd:create Data:map[conf:map[a:1] info:map[b:2]]}
이러한 한계를 극복하기 위해 우리는 두 가지 방법을 사용합니다. 접근 방식:
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") } }
이 기술을 사용하면 다음이 가능합니다. JSON 데이터를 Message 구조체로 성공적으로 역마샬링합니다. 여기서 Data 필드에는 변형 CreateMessage 유형이 포함되어 있습니다. 완전한 구현을 위해 제공된 플레이그라운드 예시를 참조하세요.
위 내용은 Go에서 JSON을 인터페이스로 효과적으로 역마샬링하는 방법은 무엇인가요?{}의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!