JSON 및 보고되지 않은 필드 처리
보고되지 않은 필드가 인코딩/json에 포함되지 않는 기술적 이유가 있습니까?그렇지 않고 자의적인 결정인 경우 보고되지 않은 경우에도 백도어 옵션('+'라고 함)이 추가될 수 있습니까?
이 기능을 얻기 위해 클라이언트코드를 내보내도록 요구하는 것은 유감스러운 일입니다.특히 소문자가 캡슐화를 제공하고 있는 경우나 구조를 정리하는 결정이 설계보다 훨씬 늦은 경우에는 더욱 그렇습니다.
사람들은 어떻게 대처하고 있나요?그냥 다 내보내요?
또한 필드 이름을 내보내면 제안된 관용구를 따르기가 어렵지 않습니다.구조체 X에 필드 Y가 있으면 접근자 메서드 Y()를 사용할 수 없다고 생각합니다.Y에 대한 인터페이스 액세스를 제공하려면 getter의 새로운 이름을 생각해내야 합니다.http://golang.org/doc/effective_go.html#Getters에 따르면 어떤 것이 자동적이지 않은 것을 얻을 수 있습니다.
기술적인 이유가 있습니다.json 라이브러리는 내보내지 않는 한 리플렉트를 사용하여 필드를 볼 수 없습니다.패키지는 자체 패키지 내에서 보고되지 않은 유형의 필드만 볼 수 있습니다.
문제를 해결하려면 내보낸 필드를 사용하여 보고되지 않은 유형을 만들 수 있습니다.Json은 문제 없이 전달되면 보고되지 않은 유형으로 마샬링 해제되지만 API 문서에는 표시되지 않습니다.그런 다음 내보내기되지 않은 유형을 포함하는 내보내기 유형을 만들 수 있습니다.이 내보낸 유형에는 다음 기능을 구현하기 위한 방법이 필요합니다.json.Marshaler
그리고.json.Unmarshaler
인터페이스입니다.
주의: 모든 코드는 테스트되지 않았으며 컴파일되지 않을 수 있습니다.
type jsonData struct {
Field1 string
Field2 string
}
type JsonData struct {
jsonData
}
// Implement json.Unmarshaller
func (d *JsonData) UnmarshalJSON(b []byte) error {
return json.Unmarshal(b, &d.jsonData)
}
// Getter
func (d *JsonData) Field1() string {
return d.jsonData.Field1
}
Stephen의 대답은 완벽하다.이와는 별도로 json에 소문자 키만 있으면 다음과 같이 키 이름을 수동으로 지정할 수 있습니다.
type Whatever struct {
SomeField int `json:"some_field"`
}
이와 같이 "SomeField" 필드를 위한 키 "some_field"를 생성하면 json에 "SomeField"를 포함하는 대신 "Some_field"를 생성할 수 있습니다.
보고되지 않은 필드를 유지해야 하는 경우 json을 구현할 수도 있습니다.시그니처를 사용하여 메서드를 정의함으로써 마셜러 인터페이스MarshalJSON() ([]byte, error)
이렇게 하려면 다음과 같이 단순히 내보내기되지 않은 필드의 버전을 내보낸 구조 리터럴을 사용합니다.
type Whatever struct {
someField int
}
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(struct{
SomeField int `json:"some_field"`
}{
SomeField: w.someField,
})
}
수 에, 「어느 쪽인가」, 「어느 쪽인가」, 「어느 쪽인가」, 「어느 쪽인가」를 사용할 도 있습니다.map[string]interface{}
다음 중 하나:
func (w Whatever) MarshalJSON() ([]byte, error) {
return json.Marshal(map[string]interface{}{
"some_field": w.SomeField,
})
}
, 「」, 「」, 「」는 주의해 주세요.interface{}
에는 몇 가지 march 등의 할 수 .uint64
코드가 테스트되지 모든 코드미테스트되지 않음)
언급URL : https://stackoverflow.com/questions/11126793/json-and-dealing-with-unexported-fields
'programing' 카테고리의 다른 글
각도에서의 객체 비교 (0) | 2023.03.02 |
---|---|
기존 Angular1 웹 앱을 Cordova 앱으로 변환하는 방법 (0) | 2023.03.02 |
반응:예기치 않은 토큰 '<' 오류 (0) | 2023.03.02 |
useEffect hook을 조기 종료하는 방법 (0) | 2023.03.02 |
약속이 해결될 때까지 각의 항해를 중지하다 (0) | 2023.03.02 |