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

时间:2014-10-02 14:20:00

标签: json vb.net asp.net-web-api

我正是在这个问题的同一个案例中: How do I make JSON.NET ignore object relationships?

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

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

2 个答案:

答案 0 :(得分:20)

我希望这会有所帮助:

如果您手动创建了模型(没有Entity Framework / EF),请首先将关系属性标记为virtual

如果您的模型是由EF创建的,EF已经为您完成了这些模式:每个Relation Property都标记为virtual,如下所示:

enter image description here

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);

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

感谢@BrianRogers回答here

答案 1 :(得分:1)

如果您使用的是 Newtonsoft.Json

标记字段
Newtonsoft.Json.JsonIgnore

代替

System.Text.Json.Serialization.JsonIgnore