JSON Deserialization : 모호한 배열 및 물체를 처리
JSON 데이터를 처리 할 때는 종종 구조적 불일치가 발생합니다. 일부 속성은 한 인스턴스의 배열로 표시되고 다른 인스턴스의 객체로 표시 될 수 있습니다. 이는 특히 유형-안전 클래스를 사용할 때 사제화 중 문제를 일으킬 수 있습니다.
질문:
Facebook에서 반환 한 다음 JSON 데이터를 고려하십시오 :
벽 게시물 (객체) :
] {
"description": "",
"permalink": "..."
}
사진 게시물 (배열) :
{
"media": [
{
"href": "...",
"src": "..."
}
]
}
모바일 벽 게시물 (객체) :
{
"name": null,
"caption": null,
"media": {}
}
벽 게시물을 움직이는 경우, "미디어"속성은 배열 대신 빈 개체로 표시됩니다. 이 차이로 인해 "FacebookMedia"객체의 배열을 기대하는 클래스를 사용할 때는 실조가 실패합니다.
솔루션 : 사용자 정의 JSON 변환기
이 상황을 처리하려면 사용자 정의 JSON 변환기를 만들 수 있습니다. 이 변환기는 JSON 구조를 확인하고 배열 또는 객체의 존재에 따라 목록 또는 NULL을 반환합니다.
public class FacebookMediaJsonConverter : JsonConverter
{
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartArray)
return serializer.Deserialize>(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);
}
}
용법:
변환기를 사용하려면 [JSONCONVERTER]
속성 주석 클래스 :
[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List Media { get; set; }
이제 Dessorialization은 "Media"속성의 배열과 객체를 성공적으로 처리합니다.
단일 개체의 확장자 :
객체가 하나만 있더라도 목록을 수신하려면 변환기를 확장하여 단일 객체를 목록으로 변환 할 수 있습니다.
public class SingleValueArrayConverter : 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 { instance };
}
else if (reader.TokenType == JsonToken.StartArray)
{
result = serializer.Deserialize(reader, objectType);
}
else
{
throw new JsonSerializationException("Unexpected token type.");
}
return result;
}
// ... 转换器实现的其余部分 ...
}
사용자 정의 JSON 변환기를 사용하여 JSON 구조의 불일치를 처리하고 성공적인 사막화를 보장 할 수 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3