我正是在这个问题的同一个案例中: How do I make JSON.NET ignore object relationships?
我看到提议的解决方案,我知道我必须使用合同左轮手枪,我也看到合同解析器的代码,但我不知道如何使用它。
答案 0 :(得分:20)
我希望这会有所帮助:
如果您手动创建了模型(没有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);
结果将忽略所有导航(关系)属性[虚拟属性]。
感谢@BrianRogers回答here。
答案 1 :(得分:1)
如果您使用的是 Newtonsoft.Json
用
标记字段Newtonsoft.Json.JsonIgnore
代替
System.Text.Json.Serialization.JsonIgnore