2016-09-16 56 views
2

我試圖從REST服務反序列化JSON。我將JSON反序列化爲一個結構體。該結構包含公共屬性。我想隱藏基本的對象,併爲每個值使用正確的對象。在這樣做的過程中,我隱藏了原始屬性,並希望找到一種方法來填充它們,儘管如此。我在stackoverflow上找到了一個relevant answer。問題在於私有屬性在反序列化過程中實際上並未分配任何值。JSON.NET不反序列化到私有屬性

然後我試圖創建我自己的ContractResolver。我發現下面的代碼爲CreateProperty(MemberInfo member, MemberSerialization memberSerialization)

var prop = base.CreateProperty(member, memberSerialization); 
if (!prop.Writable) 
{ 
    var property = member as PropertyInfo; 
    if (property != null) 
    { 
     var hasPrivateSetter = property.GetSetMethod(true) != null; 
     prop.Writable = hasPrivateSetter; 
    } 
} 

return prop; 

這仍然不分配給完全私人財產。我不確定如何從這裏開始,因爲我所能找到的所有解決方案都使用這兩種解決方案的變體。我應該如何繼續?

編輯:

我已經創建了一個展示我的問題的一個小例子。 https://gist.github.com/Herbstein/9ea14e2a4d95dd5aa4430384bfeeedf3

+0

請你可以創建一個[MVCE](http://stackoverflow.com/help/mcve)來演示你的問題。目前,您沒有展示您的模型是什麼樣子的,您是如何將合同解析器設置爲序列化器的,您是如何實際執行序列化的等等。 –

+0

@RB我馬上就會這樣做。 – Herbstein

+0

@RB。我創建了一個小例子,它在OP中鏈接。具有所有可能配置的程序輸出只是一個空行。 – Herbstein

回答

1

這是不夠的,處理私人制定者,你必須允許財產本身是私有:

internal class PrivateResolver : DefaultContractResolver { 
    protected override IList<JsonProperty> CreateProperties(
     Type type, MemberSerialization memberSerialization 
    ) { 
     return type 
      .GetProperties(BindingFlags.Instance | BindingFlags.NonPublic) 
      .Select(p => CreateProperty(p, memberSerialization)) 
      .ToList(); 
    } 

    protected override JsonProperty CreateProperty(
     MemberInfo member, MemberSerialization memberSerialization 
    ) { 
     var prop = base.CreateProperty(member, memberSerialization); 
     if (!prop.Writable && (member as PropertyInfo)?.GetSetMethod(true) != null) { 
      prop.Writable = true; 
     } 
     return prop; 
    } 
} 

我是失職,如果我也沒提AutoMapper一個更一般的解決這樣的問題。這需要你聲明更多的類,但也使類型更簡單。