2012-11-05 17 views
-1

確定,所以我有一個類似的類:轉換樹類爲更簡單的樹類和序列化到JSON保持結構

public class Channel 
{ 
    public Guid Guid{get;set;} 
    public string Title{get;set;} 

    /* GOT A LOT MORE PROPERTIES IN THIS SPACE */ 

    public Guid Parent {get;set;} 
    public List<Channel> Children{get;set;} 
} 

我也有一個List<Channels>(總共約650 Channels

ROOT頻道包含大約6個頻道,每個頻道包含,孩子等。

正如你在代碼Channel中看到的,還有很多其他的屬性, 我不想序列化在這種情況下。也就是說,所有的Data Contracts都已經在基類中定義了,我不會爲了這個動作而改變它們。

那麼,你問我有什麼問題? 我需要得到一個List<Channels>List<NewType>被序列化爲JSON並維護樹結構。

如果這是不可能的,至少,我將如何序列化List<Channels>JSON保持結構?

編輯: 我使用Newtonsoft.Json

+0

你有沒有考慮將列表序列化爲一個Channel類型的數組? – series0ne

+0

,這給了我一個平面陣列,而我需要保持結構。 – Dementic

+0

看看我的答案。它主要是通道結構的陣列......這不是你問的嗎? – series0ne

回答

1

個人而言,我會建議序列化列表中通道的陣列...考慮以下JSON例如:

{ 
    "Channel": { 
     "Guid": "27182d04-29d9-4760-86d5-484ba43cd9c6", 
     "Title": "FooBar", 
     "Parent": "52cfd532-6010-41c5-8fa9-f3bcbb97a630", 
     "Children": [ 
      { 
       "Channel": { 
        "Guid": "27182d04-29d9-4760-86d5-484ba43cd9c6", 
        "Title": "FooBar", 
        "Parent": "52cfd532-6010-41c5-8fa9-f3bcbb97a630", 
        "Children": null 
       } 
      }, 
      { 
       "Channel": { 
        "Guid": "27182d04-29d9-4760-86d5-484ba43cd9c6", 
        "Title": "FooBar", 
        "Parent": "52cfd532-6010-41c5-8fa9-f3bcbb97a630", 
        "Children": null 
       } 
      }, 
      { 
       "Channel": { 
        "Guid": "27182d04-29d9-4760-86d5-484ba43cd9c6", 
        "Title": "FooBar", 
        "Parent": "52cfd532-6010-41c5-8fa9-f3bcbb97a630", 
        "Children": null 
       } 
      } 
     ] 
    } 
} 

編輯:這裏是一個小小的測試代碼,會寫出這樣的結構:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Web.Script.Serialization; 

namespace JSONTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Channel c = new Channel(); 
      c.Guid = Guid.NewGuid(); 
      c.Parent = Guid.NewGuid(); 
      c.Title = "FooBar"; 
      c.Children = new List<Channel>(); 

      Channel a = new Channel(); 
      Channel b = new Channel(); 

      a.Guid = Guid.NewGuid(); 
      b.Guid = Guid.NewGuid(); 

      a.Parent = Guid.NewGuid(); 
      b.Parent = Guid.NewGuid(); 

      a.Title = "FooBar_A"; 
      b.Title = "FooBar_B"; 

      c.Children.Add(a); 
      c.Children.Add(b); 

      /* Serialization happens here!! */ 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      string result = serializer.Serialize(c); 
      Console.WriteLine(result); 
      Console.Read(); 
     } 
    } 

    public class Channel 
    { 
     public Guid Guid { get; set; } 
     public string Title { get; set; } 

     /* GOT A LOT MORE PROPERTIES IN THIS SPACE */ 

     public Guid Parent { get; set; } 
     public List<Channel> Children { get; set; } 
    } 
} 

下面是測試的通過JSONLint

{ 
    "Guid": "0e72c12c-a7a1-461a-8b84-8b17023e2e2f", 
    "Title": "FooBar", 
    "Parent": "d0943246-1adc-4208-bb3b-1249ffe5e7b4", 
    "Children": [ 
     { 
      "Guid": "1cf413be-d6b5-405e-8308-7c6dfe817f9a", 
      "Title": "FooBar_A", 
      "Parent": "ecf14fce-c97d-46f5-890b-bab8ff99fb4a", 
      "Children": null 
     }, 
     { 
      "Guid": "bd96e6d3-f247-4a0d-9147-92da19793e97", 
      "Title": "FooBar_B", 
      "Parent": "5cd3e765-23c2-4145-8b45-9964a7c66c54", 
      "Children": null 
     } 
    ] 
} 

有效的JSON傳遞後的結果!

編輯:我注意到的一件事是,JavaScriptSerializer不解析「頻道」,因爲整個對象是類型頻道,並且「兒童」中的每個對象都是頻道類型。如果您要通過Deserialize方法傳遞此JSON,那麼應該將其重新構建爲C#結構,並使用所有JSON持久數據。

+0

你能展示一些代碼來實現嗎?這是我想要做的,但我不知道該怎麼做... – Dementic

+0

@Dementic,當然...再看看我的答案! – series0ne

+0

@ Dementic,我注意到你已經編輯說你正在使用Newtonsoft.JSON ...我寫了我的示例使用微軟的內置JSON序列化程序。如果微軟的序列化程序可以做到這一點,我相信Newtonsoft的序列化程序也可以做到這一點!但是我沒有使用JSON.NET的經驗,因爲我建立了自己的個人JSON串行器/解串器 – series0ne