필드가 다음과 같이 일관성이 없을 수 있는 경우 JSON을 비정렬화하는 것이 어려울 수 있습니다. 문자열이거나 문자열 배열입니다. 이러한 불일치로 인해 비정렬화 오류가 발생하여 애플리케이션이 실패할 수 있습니다.
원시 JSON 데이터 캡처 사용
json.RawMessage 데이터 활용 다양한 JSON 필드를 원시 데이터로 캡처하는 구조입니다. 또한 json "-" 이름 태그를 활용하여 초기 디코딩 단계에서 필드를 숨깁니다.
type MyListItem struct { Date string `json:"date"` RawDisplayName json.RawMessage `json:"display_name"` DisplayName []string `json:"-"` }
최상위 JSON 비정렬화
최상위 JSON 비정렬화 DisplayName 필드를 채우지 않고 수준 JSON 구조.
var li MyListItem if err := json.Unmarshal(data, &li); err != nil { // handle error }
Parse Raw 표시 이름
원시 데이터 유형에 따라 표시 이름을 적절한 형식으로 언마샬링합니다.
if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } // Join arrays with "&&" li.DisplayName = strings.Join(s, "&&") } }
목록 배열 처리
앞서 언급한 논리를 루프에 통합하여 MyListings 내의 MyListItem 개체 배열을 처리합니다. 구조.
var listings MyListings if err := json.Unmarshal([]byte(data), &listings); err != nil { // handle error } for i := range listings.CLItems { li := &listings.CLItems[i] // Parse raw display name if len(li.RawDisplayName) > 0 { switch li.RawDisplayName[0] { case '"': if err := json.Unmarshal(li.RawDisplayName, &li.DisplayName); err != nil { // handle error } case '[': var s []string if err := json.Unmarshal(li.RawDisplayName, &s); err != nil { // handle error } li.DisplayName = strings.Join(s, "&&") } } }
논리 캡슐화
다양한 유형의 필드가 반복적으로 발생하는 경우 json.Unmarshaler 인터페이스를 구현하는 사용자 정의 유형에 구문 분석 논리를 캡슐화하는 것이 좋습니다. .
배열 처리 값
필드 값을 결합된 문자열이 아닌 문자열 조각으로 유지하려면 그에 따라 multiString 유형을 수정하십시오.
이러한 기술은 일관성이 없는 JSON 필드를 처리하는 강력한 방법을 제공합니다. 성공적인 언마샬링 및 정확한 데이터 검색.
위 내용은 일관되지 않은 문자열 또는 배열 JSON 필드를 효율적으로 역마샬링하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!