Go에서 파생 스칼라에 대한 UnmarshalJSON 구현
문제:
하위 유형의 정수 상수를 변환하는 사용자 정의 유형 문자열로 변환하거나 그 반대로 변환하려면 JSON 문자열을 자동으로 역마샬링해야 합니다. UnmarshalJSON은 구조체를 사용하지 않고 스칼라 값을 수정하는 방법을 제공하지 않기 때문에 이는 어려운 작업입니다.
해결책:
파생 스칼라 유형에 대해 UnmarshalJSON을 구현하려면 다음 단계를 고려하세요. :
포인터 사용 수신자:
수신자의 값을 수정하려면 UnmarshalJSON 메서드에 대한 포인터 수신기를 사용합니다.
문자열로 역마샬링:
JSON 텍스트를 일반 문자열, 모든 JSON 인용을 제거합니다.
조회 및 설정 값:
조회 함수를 사용하여 문자열 값을 기반으로 해당 PersonID를 검색합니다. 결과를 수신기에 할당합니다.
예:
func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil }
코드 예:
package main import ( "encoding/json" "fmt" ) type PersonID int const ( Bob PersonID = iota Jane Ralph Nobody = -1 ) var nameMap = map[string]PersonID{ "Bob": Bob, "Jane": Jane, "Ralph": Ralph, "Nobody": Nobody, } var idMap = map[PersonID]string{ Bob: "Bob", Jane: "Jane", Ralph: "Ralph", Nobody: "Nobody", } func (intValue PersonID) Name() string { return idMap[intValue] } func Lookup(name string) PersonID { return nameMap[name] } func (intValue *PersonID) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } *intValue = Lookup(s) return nil } type MyType struct { Person PersonID `json: "person"` Count int `json: "count"` Greeting string `json: "greeting"` } func main() { var m MyType if err := json.Unmarshal([]byte(`{"person": "Ralph", "count": 4, "greeting": "Hello"}`), &m); err != nil { fmt.Println(err) } else { for i := 0; i < m.Count; i++ { fmt.Println(m.Greeting, m.Person.Name()) } } }
출력:
Hello Ralph Hello Ralph Hello Ralph Hello Ralph
위 내용은 Go에서 파생 스칼라 유형에 대해 UnmarshalJSON을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!