Deserialisieren von JSON, wenn manchmal Array und manchmal Objekt
Bin ich mit ein bisschen Mühe Deserialisieren von Daten zurückgegeben, die von Facebook über die JSON.NET Bibliotheken.
JSON zurückgegeben ist, nur aus einer einfachen Wand ein post aussieht:
{
"attachment":{"description":""},
"permalink":"http://www.facebook.com/permalink.php?story_fbid=123456789"
}
JSON zurückgegeben für ein Foto aussieht:
"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"}}
],
Klappt alles Super und ich habe keine Probleme. Ich habe jetzt über eine einfache Wand-post von einem mobilen client mit dem folgenden JSON-und Deserialisierung jetzt schlägt dies mit einem einzigen post:
"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"
Hier ist die Klasse, ich bin Deserialisieren:
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; }
}
Ohne die FacebookMediaJsonConverter, bekomme ich eine Fehlermeldung: kann Nicht deserialisiert werden JSON-Objekt in den Typ " System.Sammlungen.Generisches.List`1[FacebookMedia]'.
was Sinn macht, da in der JSON -, Medien -, ist nicht eine Sammlung.
Ich fand dieser Beitrag beschreibt ein ähnliches problem, also habe ich versucht, diesen Weg gehen: JSON Deserialisieren, manchmal Wert ist ein array, manchmal "" (leere Zeichenfolge)
Mein converter sieht so aus:
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;
}
Welche gut funktioniert, außer ich bekomme jetzt eine neue Ausnahme:
Innen JsonSerializerInternalReader.cs, CreateValueInternal(): Unexpected token beim Deserialisieren Objekt: PropertyName
Den Wert der Leser.Der Wert "permalink". Ich kann deutlich sehen, in die Schalter, dass es kein Fall für JsonToken.PropertyName.
Gibt es etwas, was ich tun müssen, anders in meinem converter? Vielen Dank für jede Hilfe.
InformationsquelleAutor der Frage mfanto | 2011-03-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine sehr detaillierte Erklärung, wie man mit diesem Fall ist erhältlich bei "Mithilfe einer Benutzerdefinierten JsonConverter zu beheben schlechte JSON-Ergebnisse".
Verdichten, verlängern Sie die Standard-JSON.NET Konverter tun
Kommentieren Sie die Eigenschaft mit dem Thema
Erweitern Sie den Konverter, um eine Liste der von Ihnen gewünschten Art, auch für ein einzelnes Objekt
Wie im Artikel erwähnt-diese Erweiterung ist nicht ganz allgemein, aber es funktioniert, wenn Sie sind in Ordnung mit immer eine Liste.
InformationsquelleAutor der Antwort Camilo Martinez
Die Entwickler von JSON.NET ended up hilft, sich auf die Projekte codeplex-Website. Hier ist die Lösung:
Das problem war, wenn es war ein JSON-Objekt, war ich nicht Lesen Vergangenheit das Attribut. Hier ist der richtige code:
James war auch freundlich genug, um unit-tests für die oben genannten Methode.
InformationsquelleAutor der Antwort mfanto
werfen Sie einen Blick auf das System.- Laufzeit.Serialization-namespace in c# - framework, es ist Euch zu bekommen, wo Sie sein möchten, sehr schnell.
Wenn Sie möchten, können Sie sich einige Beispiel-code in diese Projekt (nicht versuchen, ein plug meine eigene Arbeit, aber ich habe gerade so ziemlich genau das, was Sie tun, aber mit einer anderen source-api.
hoffe, es hilft.
InformationsquelleAutor der Antwort jonezy
Ich denke, Sie sollten schreiben Sie Ihre Klasse so,...!!!
InformationsquelleAutor der Antwort radhey_mishra