Wie kann ich einige öffentliche Eigenschaften davon ausschließen, in ein JsonResult serialisiert zu werden?

7

Ich habe ein benutzerdefiniertes Ansichtsmodell, das mit einem JsonResult serialisiert wurde. Das ViewModel verfügt über einige Eigenschaften, die öffentlich sein müssen, aber gleichzeitig sollten diese Eigenschaften in der resultierenden Json-Ausgabe nicht sichtbar sein.

Ich habe bereits versucht, das [NonSerialized] -Attribut zu verwenden, aber das schien keine Wirkung zu haben.

Gibt es dafür einen einfachen Weg? Oder müsste ich meinen eigenen Ergebnistyp codieren (in diesem Fall werde ich wahrscheinlich nicht stören)?

    
Adrian Grigore 15.09.2009, 17:38
quelle

6 Antworten

24

Sie können ein Attribut [ScriptIgnore] auf die Member setzen, die nicht serialisiert werden sollen. Siehe ScriptIgnoreAttribute-Klasse in MSDN für ein Beispiel.

    
JacobE 08.10.2009, 06:36
quelle
2

Erstellen Sie einfach eine Schnittstelle, die anstelle einer Klasse zurückgegeben wird.

%Vor%

Erstellen Sie anschließend eine Klasse, die die Schnittstelle erbt

%Vor%

Und geben Sie die Schnittstelle, nicht die Klasse, in der Controller-Aktion

zurück %Vor%

Und das resultierende JSON wird

sein %Vor%

Eine der Herausforderungen beim clientseitigen Scripting besteht darin, dass Sie beim Ändern Ihrer Klassen keine Ahnung haben, ob Sie die clientseitige Implementierung zerstören oder nicht. Wenn Sie Schnittstellentypen in Ihrem JSON verwenden, verstehen Sie, dass Sie, wenn Sie die Schnittstelle ändern, etwas tun, was möglicherweise die clientseitige Implementierung zunichte macht. Und es erspart Ihnen auch, die Client-Seite vergeblich zu überprüfen, wenn Sie etwas ändern, das NICHT in der Oberfläche ist (also nicht serialisiert wird).

Außerdem haben Ihre ViewModels oft große Sammlungen oder komplexe Typen, die Sie nicht unbedingt auf dem Client ausgeben möchten. Es kann lange dauern, bis Informationen serialisiert oder verfügbar gemacht werden, die nicht in den Client-Code gehören. Die Verwendung von Schnittstellen macht es transparenter zu wissen, was in der Ausgabe ist.

Auch die Verwendung von Attributen wie [ScriptIgnore] für eine Eigenschaft gilt nur für ein bestimmtes Szenario (JavaScript-Serialisierung), sodass Sie genau das gleiche Problem haben müssen, wenn Sie später zum Beispiel nach XML serialisieren. Dies würde unnötigerweise Ihre Viewmodels mit Tonnen von Attributen übersäen. Wie viele von denen willst du wirklich dort? Die Verwendung von Schnittstellen gilt überall und kein Viewmodel muss mit zusätzlichen Attributen übersät sein.

    
Jani Hyytiäinen 31.03.2014 08:10
quelle
2

Schauen Sie sich JSON.NET von James Newton-King an. Es wird tun, was Sie suchen.

    
Charlino 15.09.2009 21:57
quelle
1

Erweitern Sie die JavaScriptConverter -Klasse nicht Eigenschaften mit dem NonSerializedAttribute . Dann können Sie eine benutzerdefinierte ActionResult erstellen, die Ihre JavaScriptConverter verwendet, um das Objekt zu serialisieren.

Dies erstellt eine solide und testbare Klasse, ohne Wrapper-Klassen generieren oder anonyme Objekte verwenden zu müssen.

    
Ronald 15.09.2009 20:55
quelle
0

Sie können eine Wrapperklasse erstellen, die nur die gewünschten Eigenschaften in JsonResult verfügbar macht. Im folgenden Beispiel hat Kuh 2 Eigenschaften - "Bein" und "Moo". Angenommen, Sie möchten nur "Leg" als Eigenschaft verfügbar machen. Dann

Dim cw als CowWrapper = Neuer CowWrapper (c)

gibt eine Wrapperklasse zurück, die nur "Leg" verfügbar macht. Dies ist auch nützlich für Dinge wie DataGridView, wenn Sie nur eine Teilmenge der Eigenschaften anzeigen möchten.

Öffentliche Klasse Kuh

Public ReadOnly Property Leg () als String

%Vor%

end Eigenschaft

Öffentliche ReadOnly-Eigenschaft Moo () als String

%Vor%

end Eigenschaft

Endklasse

Öffentliche Klasse CowWrapper

%Vor%

Public ReadOnly Property Leg () als String

%Vor%

end Eigenschaft

Ende Klasse

    
Larry Watanabe 15.09.2009 18:10
quelle
0

Nicht genau die Antwort, nach der Sie suchen, aber Sie können Json() mit dem folgenden Code und anonymen Klassen betrügen:

%Vor%     
David Andres 15.09.2009 18:02
quelle

Tags und Links