programing

JSON 및 보고되지 않은 필드 처리

mailnote 2023. 3. 2. 22:26
반응형

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

반응형