구조체 필드에 대한 여러 JSON 태그
서버에서 JSON 데이터를 수신하고 이를 구조체로 역마샬링해야 하는 시나리오에서, 서로 다른 JSON 태그를 사용하여 동일한 데이터를 표현하려는 상황이 발생할 수 있습니다.
JSON 태그 사용자 정의
JSON 태그는 JSON 표현에 사용되는 필드 이름을 지정합니다. 기본적으로 필드의 태그는 필드 이름과 동일합니다. 그러나 태그를 사용자 정의하여 구조체를 직렬화하거나 역직렬화할 때 사용되는 이름을 변경할 수 있습니다.
단일 JSON 태그
단일 JSON 태그를 사용하는 것은 간단합니다. 원하는 태그를 문자열 리터럴로 지정하기만 하면 됩니다.
type Foo struct { Name string `json:"name"` Age int `json:"age"` }
다중 JSON 태그
질문에서 언급했듯이 여러 JSON 태그를 직접 첨부할 수는 없습니다. 단일 필드. 그러나 이 제한 사항을 해결할 수 있는 기술이 있습니다.
구조체 캐스팅
주어진 솔루션에서는 동일한 필드 레이아웃을 가진 두 개의 구조체를 사용할 것을 제안합니다. 예:
type Foo struct { Name string Age int } type Bar struct { Name string `json:"employee_name"` Age int `json:"-"` }
그런 다음 Foo 구조체를 Bar 구조체로 캐스팅하여 JSON 태그를 변경할 수 있습니다. 이 기술은 필드 수가 많을 때 특히 유용합니다.
foo := Foo{Name: "Sam", Age: 20} bar := (*Bar)(unsafe.Pointer(&foo))
주의
이를 방지하려면 두 번째 구조체를 내보내지 않아야 한다는 점에 유의하는 것이 중요합니다. 현재 패키지 외부에서 액세스되지 않도록 합니다. 이렇게 하면 캐스팅이 의도한 대로만 수행되고 실수로 오용되지 않도록 보장됩니다.
예
다음 코드는 위에서 언급한 캐스팅 기술을 보여줍니다.
package main import ( "encoding/json" "fmt" ) type Foo struct { Name string Age int } type Bar struct { Name string `json:"employee_name"` Age int `json:"-"` } func main() { foo := Foo{Name: "Sam", Age: 20} bar := (*Bar)(unsafe.Pointer(&foo)) jsonBytes, err := json.Marshal(bar) if err != nil { fmt.Println(err) return } fmt.Println(string(jsonBytes)) }
이 코드는 Bar 구조체에 정의된 JSON 태그를 사용하여 Foo 구조체 데이터를 성공적으로 직렬화합니다. 다음 JSON 출력이 생성됩니다.
{"employee_name":"Sam"}
위 내용은 Go에서 단일 구조체 필드에 여러 JSON 태그를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!