Estoy teniendo problemas para deserializar los datos devueltos por Facebook utilizando las bibliotecas JSON.NET.Deserialización de JSON cuando a veces la matriz y algunas veces el objeto
El JSON devueltos desde un simple publicación en el muro parece:
{
"attachment":{"description":""},
"permalink":"http://www.facebook.com/permalink.php?story_fbid=123456789"
}
El JSON devuelto una foto se ve así:
"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"}}
],
Todo funciona muy bien y no tengo problemas. Ahora he encontrado con un simple publicación en el muro de un cliente móvil con el siguiente JSON, y deserialización ahora un error con este un solo mensaje:
"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"
Aquí es la clase que estoy deserializar como:
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; }
}
Sin utilizar FacebookMediaJsonConverter, aparece un error: No se puede deserializar el objeto JSON en el tipo 'System.Collections.Generic.List`1 [FacebookMedia]'. que tiene sentido, ya que en el JSON, Media no es una colección.
me encontré con este post que describe un problema similar, por lo que he intentado ir por este camino: Deserialize JSON, sometimes value is an array, sometimes "" (blank string)
Mi convertidor se ve así:
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;
}
que funciona muy bien, excepto que ahora recibe beneficios una nueva excepción:
Dentro JsonSerializerInternalReader.cs, CreateValueInternal(): símbolo inesperado objeto al deserializar: PropertyName
El valor de reader.Value es "permalink". Puedo ver claramente en el interruptor que no hay ningún caso para JsonToken.PropertyName.
¿Hay algo que deba hacer de manera diferente en mi convertidor? Gracias por cualquier ayuda.
-1 para recommendar el uso de una parte interna probada del marco sobre una biblioteca de terceros con enlaces a muestras de código? – jonezy
que parece muy inusual. – jonezy
No estoy seguro de dónde vino el -1. Aprecio la respuesta. Sospecho que probablemente sea una solución bastante pesada para un problema menor (muy probablemente debido a mi propio uso indebido de JSON.NET). Una vez dicho esto, voy a probar los métodos Systme.Runtime.Serialization y veré si termina funcionando mejor. Gracias por el enlace. – mfanto