JSON.net JsonIgnoreAttribute не работает со свойством EntityKey - PullRequest
7 голосов
/ 21 декабря 2011

Я использую JSON.net для сериализации своих объектов EntityFramework.

В прошлом я создал класс, который применяет атрибут «JsonIgnore» к свойству, а затем я установил атрибут «MetadataType» моего основного класса EntityFramework для этого вновь созданного класса.

Вот пример:

Класс, который будет применяться к классу EF:

 public class Role_DoNotSerialize
    {
        [JsonIgnore]
        public string Users { get; set; }
    }

Частичный файл класса для класса EF:

[MetadataType(typeof(Role_DoNotSerialize))]
    public partial class Role
    { 
    }

В приведенном выше примере свойство «Пользователи» не будет сериализовано при сериализации объекта «Роль».

Моя проблема в том, что эта же техника не работает, когда я добавляю в свойство EntityKey, например, так:

public class Role_DoNotSerialize
    {
        [JsonIgnore]
        public string Users { get; set; }

        [JsonIgnore]
        public System.Data.EntityKey EntityKey { get; set; }
    }

При использовании этого класса свойство EntityKey все еще сериализуется. Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 25 апреля 2012

Вы можете сделать это, внедрив свой собственный ContractResolver (пример кода с JSON.NET 4.5, но также возможно с более старыми версиями)

public class ExcludeEntityKeyContractResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        IList<JsonProperty> properties = base.CreateProperties(type,memberSerialization);
        return properties.Where(p => p.PropertyType != typeof (System.Data.EntityKey)).ToList();
    }
}

затем вы можете установить это, чтобы установить ContractResolver для вашего объекта JsonSerializerSettings

JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new ExcludeEntityKeyContractResolver();

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

2 голосов
/ 09 мая 2014

Я думаю, что последние версии JSON.NET чтят это сейчас.Этот пример работал для нас на сайте MVC, но вы можете использовать эту строку так, как хотите.

public ActionResult ContentJsonFormatted(object obj, Formatting formatting = Formatting.Indented)
{
    string result = JsonConvert.SerializeObject(obj, formatting);
    return Content(result, "text/plain");
}
...