> 백엔드 개발 > Golang > Go에서 마샬링되지 않은 JSON 데이터에 대해 유형 어설션을 수행하는 방법은 무엇입니까?

Go에서 마샬링되지 않은 JSON 데이터에 대해 유형 어설션을 수행하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-25 09:28:28
원래의
956명이 탐색했습니다.

How to Perform Type Assertions on Unmarshaled JSON Data in Go?

정렬되지 않은 데이터를 사용한 유형 어설션

분산 시스템에서 데이터는 종종 JSON 문자열로 교환됩니다. 메시지 큐에서 JSON 데이터를 검색할 때 데이터를 인터페이스로 역직렬화한 다음{} 유형 어설션을 수행하여 데이터의 실제 구조체 유형을 결정해야 하는 시나리오가 발생할 수 있습니다.

문제

수신된 JSON 문자열을 인터페이스로 역마샬링하고{} 결과를 입력하려고 하면 예상치 못한 결과가 발생할 수 있습니다. 예상되는 구조체 유형 대신 map[string]인터페이스{}를 얻습니다.

솔루션

인터페이스로 정렬 해제되는 JSON의 기본 동작{}은 유형을 생성합니다. bool, float64, string, []interface{} 및 map[string]interface{} 등이 있습니다. Something1과 Something2는 사용자 정의 구조체이므로 JSON 역마샬러에서 인식되지 않습니다.

이 문제를 해결하려면 다음 두 가지 주요 접근 방식이 있습니다.

1. 사용자 정의 구조체로 직접 비정렬화

코드:

var input Something1
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here

var input Something2
json.Unmarshal([]byte(msg), &input)
// Type assertions and processing can be performed here
로그인 후 복사

2. 지도 인터페이스에서 압축 풀기

코드:

var input interface{}
json.Unmarshal([]byte(msg), &input)

// Unpack the data from the map
switch v := input.(type) {
case map[string]interface{}:
    // Extract the data from the map and assign it to custom structs
}
로그인 후 복사

고급 접근 방식

더 다양한 솔루션을 원하시면, 언마샬링 및 유형 어설션을 처리하는 "Unpacker" 구조체 생성을 고려해보세요. process.

코드:

type Unpacker struct {
    Data       interface{}
}

func (u *Unpacker) UnmarshalJSON(b []byte) error {
    smth1 := &Something1{}
    err := json.Unmarshal(b, smth1)
    if err == nil && smth1.Thing != "" {
        u.Data = smth1
        return nil
    }

    smth2 := &Something2{}
    err = json.Unmarshal(b, smth2)
    if err != nil {
        return err
    }

    u.Data = smth2
    return nil
}
로그인 후 복사

결론

이러한 접근 방식 중 하나를 사용하면 유형을 성공적으로 수행할 수 있습니다. JSON 문자열에서 인터페이스로 처음 역마샬링된 데이터에 대한 어설션입니다.{} 접근 방식 선택은 애플리케이션의 특정 요구 사항에 따라 다릅니다.

위 내용은 Go에서 마샬링되지 않은 JSON 데이터에 대해 유형 어설션을 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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