我在使用JSON.NET庫反序列化從Facebook返回的數據時遇到了一些麻煩。反序列化JSON有時是數組,有時是對象
的JSON從只是一個簡單的牆後返回的樣子:
{
"attachment":{"description":""},
"permalink":"http://www.facebook.com/permalink.php?story_fbid=123456789"
}
的JSON返回相片看起來像:
"attachment":{
"media":[
{
"href":"http://www.facebook.com/photo.php?fbid=12345",
"alt":"",
"type":"photo",
"src":"http://photos-b.ak.fbcdn.net/hphotos-ak-ash1/12345_s.jpg",
"photo":{"aid":"1234","pid":"1234","fbid":"1234","owner":"1234","index":"12","width":"720","height":"482"}}
],
一切的偉大工程,我沒有問題。現在我遇到一個簡單的牆後,從移動客戶端與以下JSON,和反序列化失敗,現在這一個單一的差價:
"attachment":
{
"media":{},
"name":"",
"caption":"",
"description":"",
"properties":{},
"icon":"http://www.facebook.com/images/icons/mobile_app.gif",
"fb_object_type":""
},
"permalink":"http://www.facebook.com/1234"
這裏是我反序列化的類:
public class FacebookAttachment
{
public string Name { get; set; }
public string Description { get; set; }
public string Href { get; set; }
public FacebookPostType Fb_Object_Type { get; set; }
public string Fb_Object_Id { get; set; }
[JsonConverter(typeof(FacebookMediaJsonConverter))]
public List<FacebookMedia> { get; set; }
public string Permalink { get; set; }
}
沒有使用FacebookMediaJsonConverter,我得到一個錯誤:無法將JSON對象反序列化到類型'System.Collections.Generic.List`1 [FacebookMedia]'中。 這是有道理的,因爲在JSON中,媒體不是一個集合。
我發現這個職位描述了一個類似的問題,所以我已經試圖沿着這條路走下去:Deserialize JSON, sometimes value is an array, sometimes "" (blank string)
我的轉換器看起來像:
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;
}
除了我的正常工作,現在得到一個新的異常:
裏面JsonSerializerInternalReader.cs,CreateValueInternal():意外令牌反序列化對象:屬性名
reader.Value的值是「永久鏈接」。我可以清楚地看到在開關中沒有JsonToken.PropertyName的情況。
有什麼我需要在我的轉換器有不同的做法嗎?謝謝你的幫助。
-1通過第三方庫推薦使用框架的內部驗證部分,並鏈接到代碼示例? – jonezy 2011-03-07 21:06:09
似乎非常不尋常。 – jonezy 2011-03-07 21:06:30
我不確定-1從哪裏來。我很欣賞這種迴應。我懷疑它可能來自它是一個小問題的相當重量級的解決方案(很可能是由於我自己濫用JSON.NET)。話雖如此,我將嘗試嘗試Systme.Runtime.Serialization方法,看看它是否最終能夠更好地工作。感謝您的鏈接。 – mfanto 2011-03-07 21:37:47