2016-05-10 8 views
0

Ich versuche, einige schwach typisierte Daten vom ASP.NET MVC-Host zum JavaScript-Client zu senden. Schwache Typisierung bedeutet hier entweder die Eigenschaft oder als Ergebnis eine ExpandoObject.Wie Sie TypeNameHandling für alle Sammlungen bei der Serialisierung deaktivieren?

Aufgrund der TypeNameHandling = TypeNameHandling.Auto Einstellung (die ich für schwach typisierte Objekte muß), erhalte ich die $type Anmerkungen für Sammlungen als auch eine andere JSON Struktur ergibt: Statt eine einfache Anordnung zu haben, ich habe es eingewickelt in einer { $type: ..., $values: ... } Struktur .

Wie könnte ich dies global für jede Art von Sammlungen weglassen?

Ich habe versucht, eine benutzerdefinierte Contract Resolver zu implementieren, scheint aber nicht mit ExpandoObject s arbeiten.

public class JsonWebAPIContractResolver : DefaultContractResolver 
{ 
    public bool SkipTypNameHandlingOnCollections { get; set; } 

    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) 
    { 
     var property = base.CreateProperty(member, memberSerialization); 
     if (SkipTypNameHandlingOnCollections && property.PropertyType.IsCollectionType()) 
      property.TypeNameHandling = TypeNameHandling.None; 
     return property; 
    } 
} 

Im Code, den ich habe meine gute alte Erweiterungsmethode Type.IsCollectionType, die einwandfrei funktioniert. Vielleicht besteht das Problem darin, dass dynamische Objekte den Vertragauflösungsmechanismus nicht durchlaufen?

Antwort

1

Es stellte sich heraus, dass Json.NET eine DictionaryContract für meine ExpandoObject erstellt, und deshalb ging es nicht durch die CreateProperty. Natürlich macht das auf den zweiten Blick Sinn.

So habe ich es geschafft, mein Ziel mit der folgenden Erweiterung des oben genannten benutzerdefinierten Vertragslösers zu erreichen.

protected override JsonDictionaryContract CreateDictionaryContract(Type objectType) 
{ 
    var c = base.CreateDictionaryContract(objectType); 
    if (typeof(IDynamicMetaObjectProvider).IsAssignableFrom(c.UnderlyingType)) 
     c.ItemTypeNameHandling = TypeNameHandling.None; 
    return c; 
} 

Mit dieser Lösung erreichte ich etwas anderes Ziel: Ich Typnamen drehte jede dynamische Eigenschaft eines dynamischen Objekttypen für Handhabung aus, aber das ist völlig in Ordnung für mich in diesem Szenario.

Verwandte Themen