Как я могу сделать 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