JSON.NET ライブラリを使用して Facebook から返されたデータを逆シリアル化するのに少し問題があります。
シンプルなウォール投稿から返される 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 を持つモバイル クライアントからの単純なウォール ポストに出くわしました。この 1 つのポストで逆シリアル化が失敗するようになりました。
"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 では Media はコレクションではないため、これは理にかなっています。
同様の問題を説明しているこの投稿を見つけたので、次のルートをたどってみました: JSON をデシリアライズします。値が配列の場合もあれば、"" (空白の文字列) の場合もあります。
私のコンバーターは次のようになります。
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() 内: オブジェクトの逆シリアル化中に予期しないトークン: PropertyName
reader.Value の値は「permalink」です。JsonToken.PropertyName のケースがないことがスイッチではっきりとわかります。
コンバーターで別の方法で行う必要があることはありますか? 助けてくれてありがとう。