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.

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.


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.


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


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ę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.