2016-12-21 66 views
1

我有一個從服務器與格式非常大​​平原JSON這樣反序列化JSON字符串自定義.NET對象

{ "A": 1, "B" : 2, "C" : 3 } 

我不能改變格式。但

而不是讓一個megaclass

public class MegaClass 
{ 
    public int A; 
    public int B; 
    public int C; 
} 

我需要把一些屬性到另一個對象,這樣

public class MegaClass 
{ 
    public int A; 
    public SetOfVariables1 Set1; 
} 

public class SetOfVariables1 
{ 
    public int B; 
    public int C; 
} 

有沒有辦法使這項工作?

+10

爲什麼?你試圖取得什麼樣的好處?我的意思是,你*可以*做到這一點 - 例如,你可以使用自定義的'JsonConverter'來手動構建你想要的任何類,但是這是很多額外的工作,沒有明顯的好處(除非你能澄清你期望的好處? ) –

+0

或者您可以創建超級類,並在之後應用一個映射器。但正如RB所說,你想在這裏做什麼? – Stormhashe

回答

0

壞消息是,我猜你不能動態地做出來。好消息是,你可以自己處理反序列化並從那裏產生你的對象。

我想你這樣做是爲了得到一個更好的結構,但注意,你必須編寫自己的串行,如果你想獲得對象放回原來的結構。

我發現有兩個選項可以實現您試圖獲得的結果。談到Json.NET時,我並不贊成,實際上它對我來說是相當新穎的。

這裏來代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     String json = "{ 'A': 1, 'B' : 2, 'C' : 3 }"; 
     var classA = JsonConvert.DeserializeObject<MegaClass>(json,new AConverter()); 
     var classA2 = JsonConvert.DeserializeObject<MegaClass2>(json); 
    } 

    public class MegaClass2 
    { 
     public int A { get; set; } 
     public SetOfVariables SetOfVariables1 { get; set; } 

     public MegaClass2() 
     { 
      _additionalData = new Dictionary<string, JToken>(); 
      SetOfVariables1 = new SetOfVariables(); 
     } 

     [JsonExtensionData] 
     private IDictionary<string, JToken> _additionalData; 

     [OnDeserialized] 
     private void OnDeserialized(StreamingContext context) 
     { 
      int b = (int)_additionalData["B"]; 
      int c = (int)_additionalData["C"]; 

      SetOfVariables1.B = b; 
      SetOfVariables1.C = c; 
     } 
    } 

    public class MegaClass 
    { 
     public int A { get; set; } 
     public SetOfVariables SetOfVariables1 { get; set; } 
    } 

    public class SetOfVariables 
    { 
     public int B { get; set; } 
     public int C { get; set; } 
    } 

    public class AConverter : CustomCreationConverter<MegaClass> 
    { 
     public override MegaClass Create(Type objectType) 
     { 
      throw new NotImplementedException(); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      dynamic cl = serializer.Deserialize(reader); 
      var classA = new MegaClass(); 
      classA.A = cl.A; 
      var classB = new SetOfVariables(); 
      classB.B = cl.B; 
      classB.C = cl.C; 
      classA.SetOfVariables1 = classB; 
      return classA; 
     } 
    } 
} 

因此,這裏的descritption: 第一個選項使用CustomCreationConverter。我們將對象反序列化爲其原始表示並從那裏創建一個新對象。

第二個選項似乎在反序列化後初始化我們的對象。 _additionalData由框架設置,我們只是用它來填充我們的對象。

我看到第一個選項用於根據提供的json創建不同的對象。 例如,如果你有一個類AB類並且兩個延伸C類然後可以在重寫Create方法哪個對象反序列化決定。

第一個選項靈感來自Json.NET documentation

相關問題