4
我正是在這個問題同樣情況: How do I make JSON.NET ignore object relationships?我該如何做JSON序列化器忽略導航屬性?
我看到所提出的解決方案,我知道我必須使用合同左輪手槍,我也看到了合同解析器的代碼,但我不知道如何使用它。
- 我應該在WebApiConfig.vb中使用它嗎?
- 我應該修改我的實體模型嗎?
我正是在這個問題同樣情況: How do I make JSON.NET ignore object relationships?我該如何做JSON序列化器忽略導航屬性?
我看到所提出的解決方案,我知道我必須使用合同左輪手槍,我也看到了合同解析器的代碼,但我不知道如何使用它。
我希望這有助於:
如果你手動創建你的模型(不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
,請將其設置爲lik e:
// 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。
如果你和我的情況一樣,這裏是我的建議:忘掉它並將你的控制器更改爲OData。它完美的工作,並沒有與JSON序列化的問題。 – 2014-10-11 15:19:57
Carlos,我的波紋管解決方案的工作原理是否可以將其標記爲正確答案? – RAM 2017-04-19 17:16:01
我已經標記了你的答案RAM,因爲它有一些upvotes,所以它必須工作。但我評論這個,因爲它可能是有用的(如果是我)。在構造函數中,Configuration.LazyLoadingEnabled做了訣竅:public ExampleController() {012;}} {db.Configuration.LazyLoadingEnabled = false; } – 2017-04-20 09:52:12