2014-03-30 17 views
7

ich ohne Glück versuchen Objektgraph mit Kreis Bezug auf deserialisieren,Json.net deserialisieren json mit zirkulärem Verweise in MVC4

Json.net gut funktioniert, wenn zirkuläre Referenzen Serialisierung: ein $ id Objekte Hinzufügen und Austausch von Objekten with $ ref = * objectId, Wenn ich dieselben Daten zurück an die MVC-Aktion sende, wird die Deserialisierung nicht korrekt durchgeführt - die $ refs werden durch leere Objekte ersetzt.

Ich benutze json.net sowohl serialize und entserialisieren Deserialisieren wird in einem benutzerdefinierten IValueProvider implementiert - https://json.codeplex.com/discussions/347099

Ich bemerkte, dass, wenn auf ein anonymes Objekt Deserialisieren

JsonConverter.Deserialize(json); 

es wird nicht mit dem Deal kreisförmige Referenzen. aber bei der Verwendung eines generischen Typs Deserialisieren

JsonConverter.Deserialize<EntityType>(json) 

wird es richtig deserialisieren.

Aber ich kann nicht die Art in der GetValueProvider (Controllercontroller)

jede Hilfe

Bearbeiten- In meinem aktuellen fix ich die ganze json als String übergeben und verwenden

geschätzt wird finden
JsonConverter.Deserialize<EntityType>(json) 

mit der richtigen Art in der Klage des Controller, aber das ist definitiv nicht der richtige Weg, um mit json + mvc4 zu arbeiten ... ich brauche einen besseren Weg, es in Mvc zu integrieren, begann eine bo unty

Bearbeiten- mehr Code vom Typ:

[JsonObject(IsReference = true)] 
public class DynamicEntity : EntityWithID<Guid> 
{ 
    .... 

    public virtual IList<DynamicEntity> ReferenceFields { get; set; } 
} 

Die json deserialisieren ist der Ausgang der Serialisieren Methode der Json.net.

{"$id":"1","ReferenceFields":[{"$ref":"1"}],"Id":"9f9de7f3-865e-4511-aeac-a2ff01193b06"} 

Das Problem ist die Integration mit MVC, weil die json hin und her zwischen dem Server und dem Client geht. Ich habe bereits js Methoden es exakt das gleiche Format hin und her zu wechseln - getestet, wie ich es so für jetzt verwenden:

public ActionResult EntitySaveOrUpdate(string entity) 
    { 
     var entityToSave = JsonConvert.DeserializeObject<DynamicEntity>(entity); 
     ... 
    } 

Und es funktioniert gut, aber ich brauche eine bessere Integration mit MVC und nicht in allen meinen Aktionen deserialisieren ...

+0

Soweit ich gelernt habe, sind zirkuläre Referenzen schlecht und werden unerwartetes Verhalten ergeben, aber vielleicht verstehe ich die Frage nicht. Müssen in den Code beim Senden der Daten zurück zu mvc, um zu sehen, was es vor Deserialisierung ist –

+0

Die Daten sind in Ordnung, in der benutzerdefinierten ValueProvider in MVC (Link in der Frage) gibt es eine Deserialize, Json.Net's Deserialize funktioniert nur gut, wenn übergeben Sie ihm den eigentlichen Typ - den ich nicht im controllerContext finden kann. wie zirkuläre Referenzen - mit inversen Beziehungen können Sie sie nicht vermeiden. –

+1

können Sie einige der JSON ausgeben, so dass wir das Format von ihm und den zirkulären Datensatz sehen können. Kannst du auch den Code für einen 'EntityType' anzeigen, zu dem es deserialisieren würde? – Haney

Antwort

2
The challenge is dynamically typing at compile-time an un-typed languages (JSON). 

Seit JSON ist eigentlich JavaScript Object Notation und JavaScript ist schwach typisierte (oder un-getippt), die Kompilierung-Interpreter ist nicht sicher, wenn "1" bezieht sich auf eine int, Doppel oder Zeichenfolge Typ.

Hinweis, die Sie nicht das gleiche Problem, wenn Sie ein DynamicEntity verwenden, da die Laufzeit zu JavaScript in ähnlicher Weise zu interpretieren erlaubt ist.

  • This post wie Dynamik und statisch-anonymous-Typen behandeln Deserialisierung ein wenig alt, aber immer noch relevant. Ihr Ansatz besteht darin, JsonConvert.DeserializeAnonymousType() - eine dynamische Methode - zu verwenden, um anonym zurückzugeben.

  • This post erweitert Web Api ‚s DataContractJsonSerializer, und wie es schränkt die Optionen mit anonymen Typen. Die Antwort vorgeschlagen ist

„die MediaTypeFormatter zu ersetzen und in unserem eigenen JSON Serializer Stecker“

Dies bedeutet eine Menge Arbeit für Ihre begrenzten Bedürfnisse.

Was Sie finden, ist, kurz mit Linq Projektion, Ihre DynamicEntity ist wahrscheinlich so guter Ansatz, wie Sie finden werden.

1

Haben Sie versucht, JsonConverter zu schreiben und in Ihrer ValueProviderFactory registrieren.

JSONSerializer.Converters.Add(new DynamicEntityObjectConverter()); 

Und in Ihrem Konverter Sie manualy JsonConverter.Deserialize<EntityType>(json) verwenden können, die für die Zirkular Nachschlagewerken.

Verwandte Themen