문제:
어떻게 구조체를 인코딩할 수 있습니까? 사용자 정의 MarshalJSON() 메서드가 포함된 구조체가 있습니까? 예상되는 출력은 외부 구조체의 필드를 인코딩하는 동시에 포함된 구조체의 사용자 정의 마샬링을 유지하는 것입니다.
예:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` }
포함된 Person struct에는 사용자 정의 MarshalJSON() 메서드가 있습니다.
func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) }
직원 마샬링 인스턴스가 중단되어 다음이 발생합니다.
{"name": "BOB"}
해결책:
Person에 MarshalJSON()을 구현하는 대신 MarshalJSON()을 구현하는 새 Name 유형을 만듭니다. 그런 다음 Person을 수정하여 이 이름 유형을 사용합니다.
type Name string func (n Name) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(string(n)), }) } type Person struct { Name Name `json:"name"` }
이렇게 하면 Employee 필드를 예상대로 인코딩하면서 사용자 정의 마샬링 논리를 이름 필드에 적용할 수 있습니다.
일반 솔루션:
보다 일반적인 솔루션의 경우 외부 구조체에 MarshalJSON()을 구현합니다. 내부 유형의 메서드가 외부 유형으로 승격되는 동안 외부 유형은 결과를 map[string]interface{}와 같은 일반 구조로 역정렬화하고 자체 필드를 추가할 수 있습니다.
예:
type Person struct { Name string `json:"name"` } type Employee struct { *Person JobRole string `json:"jobRole"` } func (e *Employee) MarshalJSON() ([]byte, error) { b, err := e.Person.MarshalJSON() if err != nil { return nil, err } var m map[string]interface{} if err := json.Unmarshal(b, &m); err != nil { return nil, err } m["jobRole"] = e.JobRole return json.Marshal(m) }
위 내용은 사용자 정의 마샬링을 사용하여 임베디드 구조체에 대해 JSON()을 올바르게 마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!