2013-05-25 6 views
8

ich ein Objekt-Array haben, die Strings und longs und diese Klasse enthält:Deserialisieren Objekt [], die enthält primitive Typen und ein Klassentyp

public class SimpleMailAddress 
{ 
    public string Address { get; set; } 
    public string Name { get; set; } 

    public static implicit operator MailAddress(SimpleMailAddress m) 
    { 
     return new MailAddress(m.Address, m.Name); 
    } 
} 

Wenn jedoch das JSON-Array mit Json.Net Deserialisieren ich ein anonymer Typ, der Address und Name anstelle eines SimpleMailAddress Objekts enthält.

Ich möchte kein stark typisiertes Objekt zum Deserialisieren erstellen, da es nicht wiederverwendet wird und ich viele Objekte dafür erstellen müsste. Gibt es eine Möglichkeit, dies mit Json.Net oder einer anderen Bibliothek zu tun? Diese

ist, wie ich die Serialisierung/Deserialisierung:

var json = JsonConvert.SerializeObject(myObject); 
var myObject = JsonConvert.DeserializeObject<MailMessageRequest>(json); 

Und MailMessageRequest:

public class MailMessageRequest 
{ 
    public string Mailer { get; set; } 
    public string Method { get; set; } 
    public object[] Args { get; set; } 
} 
+1

Können Sie nach dem Code, der zeigt, wie Sie serialisiert und deserialisiert – cheedep

+0

@cheedep - Sicher, hinzugefügt. –

+0

Können Sie auch ein Beispiel für den Json hinzufügen? Und ich denke deine Frage ist ein wenig unklar. Was genau willst du erreichen? Möchten Sie in anonymes Objekt oder 'SimpleMailAddress' deserialisieren? –

Antwort

4

Json enthält keine inherit Wissen über Ihre SimpleMailAddress Klasse. Wenn Sie also die Deserialisierung angeben, dass die Args-Eigenschaft vom Typ Object ist, tut der Deserializer das Beste, was er kann (indem er einen anonymen Typ erstellt). Es sieht nur Daten, es hat kein Wissen, dass Sie ein Objekt SimpleMailAddress wollen.

Json.net hat eine JObject Klasse. Verwenden Sie diesen anstelle von Object für Ihren Args-Parameter, wenn der tatsächliche Inhalt von Args den Typ ändern kann.

Anschließend können Sie bei Bedarf die Daten aus dem Objekt JObject lesen.

Wenn Sie den Inhalt von Arg nicht interessieren, lassen Sie ihn als Object und ignorieren Sie ihn.

Bearbeiten: JSon.Net kann Typinformationen während der Serialisierung einbetten, die während der Deserialisierung verwendet werden können.

Lassen Sie Ihren Args Parameter als Object. Verwenden Sie dann die Option TypeNameHandlingAll während Serialisierung und Deserialisierung.

var json = JsonConvert.SerializeObject(myObject, Formatting.None, 
    new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); 
var myObject = JsonConvert.DeserializeObject<MailMessageRequest>(json, 
    new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }); 

Sie sollten mit Ihrem Args Objekt als die gewünschten SimpleMailAddress Objekt am Ende.

+1

Ich habe versucht Deserialisierung mit 'JsonConvert.SerializeObject (body, Formatierung.Nein, neue JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All})' auch, die die Typen angibt, aber es deserialisiert es immer noch in ein 'JObject'. –

+0

Ich habe meine Antwort oben aktualisiert. –

+0

Ahh, süße, gute Arbeit. Ich habe das genauso herausgefunden wie du;) Ich bin mir aber nicht sicher, ob ich das 'TypeNameAssemblyFormat', das ich eingefügt habe, brauche. –

0

Die Datenkontakt-Serialisierer, die in das.net-Framework integriert sind, haben das Konzept bekannter Typen, wo Sie ihnen sagen, welche Typen zu erwarten sind, und sie verwendet diese während der Deserialisierung.

Es gibt einen eingebauten Json Data Contract Serializer, aber ich bin mir nicht sicher, ob er mit Ihren Json Daten kompatibel ist, er muss möglicherweise serialisiert und deserialisiert werden, um mit dieser Methode zu arbeiten.

0

Ich habe es. Ich habe diese Einstellungen verwenden:

var settings = new JsonSerializerSettings 
       { 
        TypeNameHandling = TypeNameHandling.All, 
        TypeNameAssemblyFormat = FormatterAssemblyStyle.Full 
       }; 
var json = JsonConvert.SerializeObject(object, Formatting.None, settings); 
var object = JsonConvert.DeserializeObject<MailMessageRequest>(message.Body, settings); 
Verwandte Themen