Вопрос по asp.net-web-api, serialization, asp.net-mvc-4, asp.net – Исключить свойство из сериализации json в ApiController

4

Я пытаюсь исключить свойства из сериализации в JSON в веб-ApiControllers. Я проверил следующие 2 сценария работы.

Я включил следующие атрибуты в свойство, которое я хочу исключить.

<code>[System.Web.Script.Serialization.ScriptIgnore]
[System.Xml.Serialization.XmlIgnore]
</code>

Если я вручную сериализую свой объект с помощью JavaScriptSerializer, свойство будет исключено. Кроме того, если я просматриваю сериализованный вывод XML из веб-ApiController, свойство исключается. Проблема в том, что сериализованный JSON через веб-интерфейс ApiController все еще содержит это свойство. Есть ли другой атрибут, который я могу использовать, который исключит свойство из сериализации JSON?

UPDATE:

Я понял, что все мои тесты были в гораздо более сложном проекте, и что я не пробовал это в изолированной среде. Я сделал это и все еще получаю те же результаты. Вот пример некоторого кода, который терпит неудачу.

<code>public class Person
{
    public string FirstName { get; set; }

    [System.Web.Script.Serialization.ScriptIgnore]
    [System.Xml.Serialization.XmlIgnore]
    public string LastName { get; set; }
}

public class PeopleController : ApiController
{
    public IEnumerable<Person> Get()
    {
        return new[]
                   {
                       new Person{FirstName = "John", LastName = "Doe"},
                       new Person{FirstName = "Jane", LastName = "Doe"}
                   };
    } 
}
</code>

Вот сгенерированный вывод.

JSON:

<code>[
    {
        "FirstName" : "John",
        "LastName" : "Doe"
    },
    {
        "FirstName" : "Jane",
        "LastName" : "Doe"
    }
]
</code>

XML:

<code><?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Person>
        <FirstName>John</FirstName>
    </Person>
    <Person>
        <FirstName>Jane</FirstName>
    </Person>
</ArrayOfPerson>
</code>
ах, понял Я стою исправлено. McGarnagle
Хорошо, еще одна попытка ... проверьте решение этого парня:stackoverflow.com/questions/1302946/… McGarnagle
Проверьте это: кажется, что ответ заключается в том, что связыватель моделей делает это, и вам нужно реализовать свое связующее звено модели:stackoverflow.com/questions/7330555/…. McGarnagle
Я не рассматриваю это как дубликат этого, поскольку я не могу использовать IgnoreDataMember, потому что мой объект и все его свойства все еще должны быть сериализованы для связи WCF за кулисами. Я предполагаю, что корень моего вопроса в том, что ASP.NET использует для сериализации в JSON? Кажется, они не используют JavaScriptSerializer. Adam Carr
возможный дубликатIgnoring properties when serializing McGarnagle

Ваш Ответ

5   ответов
4

IgnoreDataMember это именно то, что нам нужно в вашем / моем сценарии:

[System.Runtime.Serialization.IgnoreDataMember]
public int NotSerialized { get; set; }

Согласно MSDN,IgnoreDataMember пришел с .NET 3.0 SP2.

0

это покрывает то, что мне нужно. Он показывает, что вы можете менять форматеры. Это даже включает примерный форматировщик, который использует JavaScriptSerializer, который мне нужен.

http://wildermuth.com/2012/2/22/WebAPI_for_the_MVC_Guy

4

В бета-версии Web API использовал DataContractJsonSerializer для сериализации JSON. Однако это изменилось;Последняя версия веб-API используетjson.net по умолчанию, хотя вы можете переопределить это и использовать вместо него DataContractJsonSerializer.

С DataContractJsonSerializer вы можете использовать атрибуты [DataContract] для управления сериализацией. Я до сих пор не очень хорошо знаком с json.net, поэтому не знаю, как он контролирует сериализацию.

Это все еще верно для службы WCF и .NET 4.5?
Начиная с этой даты, если вы используете MVC 4 Web Api из коробки, вы можете украсить свойство для исключения с помощью Newtonsoft.Json.JsonIgnore
1

ать конкретное действие / запрос, вы можетепопробуй этот подход.

4

[JsonIgnore] атрибут для специфичного для JSON исправления; или вы можете использовать[DataContract] а также[DataMember] для исправления, которое работает как с форматером JSON, так и с (XML)DataContractSerializer.

Эта статья содержит более подробную информацию о форматерах форматирования медиа по умолчанию:

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_media_type_formatter

Похожие вопросы