JSON 역직렬화: 모호한 배열 및 객체 처리
JSON 데이터를 처리할 때 구조적 불일치가 자주 발생합니다. 일부 속성은 한 인스턴스에서는 배열로 표시되고 다른 인스턴스에서는 개체로 표시될 수 있습니다. 이로 인해 역직렬화 중에, 특히 유형이 안전한 클래스를 사용할 때 문제가 발생할 수 있습니다.
질문:
Facebook에서 반환한 다음 JSON 데이터를 고려해 보세요.
월 포스트(개체):
<code class="language-json"> { "description": "", "permalink": "..." }</code>
사진 포스트(배열):
<code class="language-json"> { "media": [ { "href": "...", "src": "..." } ] }</code>
모바일 담벼락(객체) :
<code class="language-json"> { "name": null, "caption": null, "media": {} }</code>
이동벽 게시물의 경우 "media" 속성이 배열이 아닌 빈 객체로 표현됩니다. 이러한 차이로 인해 "FacebookMedia" 개체 배열이 필요한 클래스를 사용할 때 역직렬화가 실패하게 됩니다.
솔루션: 사용자 정의 JSON 변환기
이 상황을 처리하기 위해 사용자 정의 JSON 변환기를 만들 수 있습니다. 이 변환기는 JSON 구조를 검사하고 배열이나 개체의 존재 여부에 따라 목록이나 null을 반환합니다.
<code class="language-csharp">public class FacebookMediaJsonConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartArray) return serializer.Deserialize<List<FacebookMedia>>(reader); else return null; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanConvert(Type objectType) { return objectType == typeof(List<FacebookMedia>); } }</code>
사용법:
변환기를 사용하려면 [JsonConverter]
속성으로 클래스의 속성에 주석을 답니다.
<code class="language-csharp">[JsonConverter(typeof(FacebookMediaJsonConverter))] public List<FacebookMedia> Media { get; set; }</code>
이제 역직렬화는 "미디어" 속성의 배열과 개체를 성공적으로 처리합니다.
단일 개체에 대한 확장:
객체가 하나만 있어도 목록을 받고 싶다면 변환기를 확장하여 단일 객체를 목록으로 변환할 수 있습니다.
<code class="language-csharp">public class SingleValueArrayConverter<T> : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { object result; if (reader.TokenType == JsonToken.StartObject) { T instance = (T)serializer.Deserialize(reader, typeof(T)); result = new List<T> { instance }; } else if (reader.TokenType == JsonToken.StartArray) { result = serializer.Deserialize(reader, objectType); } else { throw new JsonSerializationException("Unexpected token type."); } return result; } // ... 转换器实现的其余部分 ... }</code>
사용자 지정 JSON 변환기를 사용하면 JSON 구조의 불일치를 처리하고 성공적인 역직렬화를 보장할 수 있습니다.
위 내용은 역직렬화 중에 모호한 JSON 배열 및 개체를 처리하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!