2014-10-02 96 views
4

我正是在這個問題同樣情況: How do I make JSON.NET ignore object relationships?我該如何做JSON序列化器忽略導航屬性?

我看到所提出的解決方案,我知道我必須使用合同左輪手槍,我也看到了合同解析器的代碼,但我不知道如何使用它。

  • 我應該在WebApiConfig.vb中使用它嗎?
  • 我應該修改我的實體模型嗎?
+0

如果你和我的情況一樣,這裏是我的建議:忘掉它並將你的控制器更改爲OData。它完美的工作,並沒有與JSON序列化的問題。 – 2014-10-11 15:19:57

+0

Carlos,我的波紋管解決方案的工作原理是否可以將其標記爲正確答案? – RAM 2017-04-19 17:16:01

+0

我已經標記了你的答案RAM,因爲它有一些upvotes,所以它必須工作。但我評論這個,因爲它可能是有用的(如果是我)。在構造函數中,Configuration.LazyLoadingEnabled做了訣竅:public ExampleController() {012;}} {db.Configuration.LazyLoadingEnabled = false; } – 2017-04-20 09:52:12

回答

10

我希望這有助於:

如果你手動創建你的模型(不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,請將其設置爲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

相關問題