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 중국어 웹사이트의 기타 관련 기사를 참조하세요!