json deserialization: التعامل مع المصفوفات والكائنات الغامضة
عند معالجة بيانات JSON ، فغالبًا ما تواجه عدم الاتساق الهيكلي. يمكن تمثيل بعض الخصائص كصفائف في حالة واحدة وكأشياء في أخرى. يمكن أن يسبب هذا مشاكل أثناء التخلص من التسلسل ، خاصة عند استخدام فئات الآمنة.
سؤال:
النظر في بيانات JSON التالية التي تم إرجاعها بواسطة Facebook:
منشورات الجدار (كائن):
]] {
"description": "",
"permalink": "..."
}
منشورات الصور (صفيف):
{
"media": [
{
"href": "...",
"src": "..."
}
]
}
منشورات جدار الهاتف المحمول (كائن):
{
"name": null,
"caption": null,
"media": {}
}
في حالة نقل المشاركات الجدارية ، يتم تمثيل سمة "الوسائط" ككائن فارغ بدلاً من صفيف. يؤدي هذا الاختلاف إلى فشل إلغاء التالي عند استخدام فئة تتوقع مجموعة من كائنات "Facebookmedia".
الحل: محول JSON مخصص
للتعامل مع هذا الموقف ، يمكننا إنشاء محول JSON مخصص. سيقوم هذا المحول بالتحقق من بنية JSON وإرجاع قائمة أو خالية بناءً على وجود صفيف أو كائن.
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; }
امتدادات للكائنات المفردة:
إذا كنت تريد استلام قائمة حتى لو كان كائنًا واحدًا فقط ، فيمكنك تمديد المحول لتحويل كائن واحد إلى قائمة.
فئة عامة واحدة { Override Object Readjson (jsonreader reader ، type ObjectType ، Object NerventValue ، Jsonserializer Serializer) { نتيجة الكائن if (reader.tokentype == jSontoken.StartObject) { t مثيل = (t) serializer.deserialize (reader ، typeof (t)) ؛ النتيجة = قائمة جديدة
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;
}
// ... 转换器实现的其余部分 ...
}
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3