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.

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.


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.


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;"


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.