Ignorieren eines Felds während der .NET JSON-Serialisierung; ähnlich wie [XmlIgnore]?

80

Ich habe eine POCO-Klasse, die als JSON-Zeichenfolge in .NET 3.5 sp1 an den Browser gesendet wird. Ich verwende nur die Standard-JSON-Serialisierung und habe einige Felder, die ich ignorieren möchte. Ich möchte ihnen ein Attribut ähnlich [System.Xml.Serialization.XmlIgnore] hinzufügen, damit sie nicht serialisiert werden.

runxc1 Bret Ferrier
quelle

Antworten:

121

Ich verwende das ScriptIgnore- Attribut für mein Modell wie folgt :

public class Item
{
    [ScriptIgnore]
    public Item ParentItem { get; set; }
}

In diesem speziellen Szenario wurde vom Json-Serializer ein Zirkelreferenzfehler angezeigt, sodass ich ihn einfach ignorierte. Ich habe hier auf SO eine ähnliche Frage gestellt, als ich auf den Unterschied zwischen einem Modell und ViewModel aufmerksam wurde.

JMP
quelle
1
Was ist, wenn es nicht POCO, sondern ein generiertes EntityModel ist? Ich möchte den generierten Code nicht bearbeiten. Gibt es eine Problemumgehung, um dem generierten Entitätsmodell das ScriptIgnore-Attribut hinzuzufügen?
Hazimdikenli
@hazimdikenli Möglicherweise müssen Sie hierfür eine Teilklasse verwenden.
Anand
11
Vergessen Sie nicht, einen Verweis auf "System.Web.Extensions" hinzuzufügen, damit dies funktioniert
Levitikon
1
Dies hat mir geholfen, zu verhindern, dass mein toJson (Modell) einige unerwünschte Felder zurückbringt. Idealerweise müssen Sie jedoch mit einer API einen neuen Bereich mit einem neuen Modell und einem neuen Controller erstellen, um Kreuzanmerkungen zu vermeiden. Aber ich bin zu faul. Danke +1
Piotr Kula
27
[ScriptIgnore] 

ist dein Huckaberry.

Wyatt Barnett
quelle
1
Es ist eigentlich "Huckle Bearer", aber ich gebe dir eine +1 für die Mühe und den Film. :)
Bryan Ray
8
Die ursprüngliche Antwort ist richtig, er sagt "Huckleberry", nicht "Huckle Bearer". imsdb.com/scripts/Tombstone.html
heisenberg
5
... wie in "Huckleberry Finn" - ein Hinweis auf den Inbegriff von "Jeder Mann", der instinktiv danach strebt, "das Richtige zu tun" - ein wahrer Freund, auf den man sich immer verlassen kann ... daher "Ich bin dein Huckleberry" , was bedeutet "du kannst auf mich zählen".
John Holliday
2

Sie müssen nur die [ScriptIgnore(ApplyToOverrides = true)]Datei in Ihre Textvorlagendatei (.tt) einfügen.

Hier ein Teil meiner Textvorlage vorher

#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

Nachdem ich den Code eingefügt hatte, wurde die Zeile über codeStringGeneratormeinen Klassen automatisch generiert und sah folgendermaßen aus:

[ScriptIgnore(ApplyToOverrides = true)]
public virtual ICollection<Currency> Currencies { get; set; }

Ich musste auch die UsingDirectivesFunktion zum Einfügen ändern"using System.Web.Script.Serialization;"

Alex Boutin Flegel
quelle
ApplyToOverridesscheint auf einem virtuellen Grundstück sehr wichtig zu sein
Todd
1

Legen Sie die Eigenschaft als intern fest. Hängt jedoch von Ihrer Struktur ab. In Betracht ziehen.

hakan
quelle