如何进行JSON序列化程序忽略导航属性?

Car*_*los 8 vb.net json asp.net-web-api

我正是在这个问题的相同情况下: 我如何使JSON.NET忽略对象关系?

我看到提议的解决方案,我知道我必须使用合同左轮手枪,我也看到合同解析器的代码,但我不知道如何使用它.

  • 我应该在WebApiConfig.vb中使用它吗?
  • 我应该修改我的实体模型吗?

RAM*_*RAM 24

我希望这有帮助:

如果已手动创建模型(不带Entity Framework/ EF),请virtual首先将关系属性标记为.

如果您的模型是由您创建的EF,那么Relation Property已经为您创建了:每个virtual都标记为JSON,如下所示:

在此输入图像描述

现在,ContractResolver序列化程序可以使用此自定义代码忽略这些关系属性:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要使JSON.NET使用上述内容JSON.NET,请将其设置如下:

// 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);
Run Code Online (Sandbox Code Playgroud)

结果将忽略所有导航(关系)属性[虚拟属性].


感谢来自@BrianRogers他的回答在这里.

  • 你是救生员!! (2认同)

s k*_*s k 5

如果您正在使用Newtonsoft.Json

将字段标记为

Newtonsoft.Json.JsonIgnore
Run Code Online (Sandbox Code Playgroud)

代替

System.Text.Json.Serialization.JsonIgnore
Run Code Online (Sandbox Code Playgroud)