Ignorowanie pola podczas serializacji .NET JSON; podobne do [XmlIgnore]?

80

Mam klasę POCO, która jest wysyłana do przeglądarki jako ciąg JSON w .NET 3.5 sp1. Używam tylko domyślnej serializacji JSON i mam kilka pól, które chcę zignorować. Chcę umieścić na nich atrybut podobny do [System.Xml.Serialization.XmlIgnore], aby nie były serializowane.

runxc1 Bret Ferrier
źródło

Odpowiedzi:

121

Używam ScriptIgnore atrybutu na moim modelu tak:

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

W tym konkretnym scenariuszu otrzymałem cykliczny błąd odwołania z serializatora Json, więc po prostu go zignorowałem. Ja zadając podobne pytanie tutaj na SO , kiedy został włączony do różnicy pomiędzy Model i ViewModel.

JMP
źródło
1
co, jeśli nie jest to POCO, ale wygenerowany EntityModel, nie chcę edytować wygenerowanego kodu, czy istnieje obejście, aby dodać atrybut ScriptIgnore do wygenerowanego modelu jednostki.
hazimdikenli
@hazimdikenli, być może będziesz musiał użyć do tego klasy częściowej.
Anand,
11
Nie zapomnij dodać odniesienia do „System.Web.Extensions”, aby to działało
Levitikon,
1
Pomogło mi to powstrzymać mój toJson (Model) przywracający niektóre niechciane pola, ale najlepiej z API, będziesz musiał utworzyć nowy obszar z nowym modelem i kontrolerem, aby uniknąć krzyżowych adnotacji ... ale jestem zbyt leniwy. Dzięki +1
Piotr Kula
27
[ScriptIgnore] 

to twoja jagoda.

Wyatt Barnett
źródło
1
Właściwie to „Huckle Bearer”, ale dam ci +1 za wysiłek i film. :)
Bryan Ray
8
Oryginalna odpowiedź jest prawidłowa, mówi „huckleberry”, a nie „huckle bearer”. imsdb.com/scripts/Tombstone.html
heisenberg
5
... jak w „Huckleberry Finn” - nawiązanie do kwintesencji „każdego mężczyzny”, który instynktownie stara się „robić to, co słuszne” - prawdziwy przyjaciel, na którego zawsze można liczyć… stąd „Jestem twoim Huckleberry” czyli „możesz na mnie liczyć”.
John Holliday,
2

Wystarczy dodać [ScriptIgnore(ApplyToOverrides = true)]do pliku szablonu tekstowego (.tt).

Tutaj część mojego wcześniejszego szablonu tekstowego

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

Po wstawieniu kodu wiersz powyżej codeStringGeneratormoich klas automatycznie wygenerowanych i wyglądał tak:

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

Musiałem również zmodyfikować UsingDirectivesfunkcję wstawiania"using System.Web.Script.Serialization;"

Alex Boutin Flegel
źródło
ApplyToOverrideswydaje się być bardzo ważny na wirtualnej nieruchomości
Todd
1

Ustaw właściwość jako wewnętrzną. Zależy to jednak od twojej struktury. Wziąć pod uwagę.

hakan
źródło