Ігнорування поля під час серіалізації .NET JSON; схожий на [XmlIgnore]?


80

У мене є клас POCO, який надсилається браузеру як рядок JSON у .NET 3.5 sp1. Я просто використовую серіалізацію JSON за замовчуванням, і у мене є деякі поля, які я хочу ігнорувати. Я хочу поставити на них атрибут, схожий на [System.Xml.Serialization.XmlIgnore], щоб вони не були серіалізованими.

Відповіді:


121

Я використовую атрибут ScriptIgnore у своїй моделі так:

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

У цьому конкретному сценарії я отримував кругову помилку посилання від серіалізатора Json, тому я просто її ігнорував. Я задавав подібне запитання тут, на SO, коли мене зацікавили в різниці між Model і ViewModel.


1
що, якщо це не POCO, а згенерований EntityModel, я не хочу редагувати згенерований код, чи є обхідне рішення для додавання атрибута ScriptIgnore до згенерованої моделі сутності.
hazimdikenli

@hazimdikenli, можливо, для цього доведеться використовувати частковий клас.
Ананд

11
Не забудьте додати посилання на "System.Web.Extensions", щоб це працювало
Levitikon

1
Це допомогло мені зупинити мою toJson (модель), яка повертає деякі небажані поля ,, але в ідеалі за допомогою API вам потрібно буде створити нову область, з новою моделлю та контролером, щоб уникнути перехресних анотацій .. але мені надто лінь. Спасибі +1
Piotr Kula

27
[ScriptIgnore] 

це твій харкаберрі.


1
Це насправді "Геклоносій", але я дам вам +1 за зусилля та фільм. :)
Брайан Рей

8
Оригінальна відповідь є правильною, він говорить "гекльберрі", а не "хакель". imsdb.com/scripts/Tombstone.html
Гейзенберг

5
... як у "Гекльберрі Фін" - посилання на квінтесенцію "кожен чоловік", який інстинктивно прагне "робити все правильно" - справжнього друга, на якого ти завжди можеш розраховувати ... отже "Я твій Гекльберрі" , що означає "ти можеш на мене розраховувати".
Джон Холлідей

2

Вам просто потрібно додати [ScriptIgnore(ApplyToOverrides = true)]файл у файл текстового шаблону (.tt).

Ось частина мого текстового шаблону раніше

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

Після того, як я вставив код, рядок над codeStringGeneratorмоїми класами, що автоматично генеруються, виглядав так:

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

Мені також потрібно було змінити UsingDirectivesфункцію для вставки"using System.Web.Script.Serialization;"


ApplyToOverridesздається дуже важливим для віртуального майна
Тодд,

1

Встановити властивість як внутрішнє. Однак це залежить від вашої структури. Приймати до уваги.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.