Как я могу сделать JSON сериализатор игнорировать свойства навигации?

Я точно в том же случае, что этот вопрос: Как я могу заставить JSON.NET игнорировать объектные отношения?

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

  • Должен ли я использовать его в WebApiConfig.vb?
  • Должен ли я изменить мою модель сущности в любом случае?

2 ответа

Решение

Надеюсь, это поможет:

Если вы создали свои модели вручную (без Entity Framework/EF), пометьте свойства отношения как virtual первый.

Если ваши модели были созданы EF, EF уже сделал это для вас: каждый Relation Property помечен как virtual, как видно ниже:

Эти свойства отношений теперь могут игнорироваться JSON сериализатор с помощью этого пользовательского кода:

class CustomResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty prop = base.CreateProperty(member, memberSerialization);
        var propInfo = member as PropertyInfo;
        if (propInfo != null)
        {
            if ( propInfo.GetMethod.IsVirtual && !propInfo.GetMethod.IsFinal)
            {
                prop.ShouldSerialize = obj => false;
            }
        }
        return prop;
    }
}

Чтобы сделать JSON.NET используйте выше ContractResolver, установите это так:

    // Serializer settings
    JsonSerializerSettings settings = new JsonSerializerSettings();
    settings.ContractResolver = new CustomResolver();
    settings.PreserveReferencesHandling = PreserveReferencesHandling.None;
    settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    settings.Formatting = Formatting.Indented;

    // Do the serialization and output to the console
    string json = JsonConvert.SerializeObject(pc, settings);

В результате все свойства навигации (отношения) [виртуальные свойства] будут игнорироваться.


Спасибо от Brian Rogers за его ответ здесь.

Если вы используете Newtonsoft.Json

Отметить поле с помощью

      Newtonsoft.Json.JsonIgnore

Вместо

      System.Text.Json.Serialization.JsonIgnore
Другие вопросы по тегам