2014-12-30 22 views
2

我有一個ASP.NET MVC應用程序。這個應用程序包括C#,Razor和JSON.NET。我有一個C#對象,看起來像這樣:將動態C#對象序列化爲JSON

public class MyBlueprint 
{ 
    public string Name { get; set; } 

    public string Approach { get; set; } 

    public object Value { get; set; } 
} 

在這個時候,我有MyBlueprint對象的列表是這樣的:

List<MyBlueprint> x = new List<MyBlueprint>(); 
{ 
    new MyBlueprint { Name="Bill", Approach="straight", Value=1 }, 
    new MyBlueprint { Name="Bill", Approach="straight", Value=7 }, 
    new MyBlueprint { Name="Bill", Approach="straight", Value=10 }, 
    new MyBlueprint { Name="John", Approach="straight", Value=120 }, 
    new MyBlueprint { Name="John", Approach="straight", Value=105 }, 
    new MyBlueprint { Name="John", Approach="straight", Value=150 }, 
    new MyBlueprint { Name="John", Approach="straight", Value=100 }, 
    new MyBlueprint { Name="Jill", Approach="curved", Value=1 }, 
    new MyBlueprint { Name="Jill", Approach="curved", Value=2 }, 
    new MyBlueprint { Name="Jill", Approach="curved", Value=5 }, 
    new MyBlueprint { Name="Jill", Approach="curved", Value=8 } 
}; 

我需要拉平的MyBlueprint集合對象轉換爲預定義的JSON結構。最終的目標是讓JSON在我認爲是這樣的:

var results = [ 
    { "name": "Bill", "approach":"straight", options: { begin: 1, end: 10 } }, 
    { "name": "John", "approach":"straight", options: { begin: 100, end: 150 } }, 
    { "name": "Jill", "approach":"curved", options: { chosen: [1, 2, 5, 8] } } 
]; 

options參數的基礎上,approach值不同的屬性。上面的JSON顯示了兩種不同的結構:curvedstraight。我會有更多。出於這個原因,我試圖找出一個動態的方法,而不需要創建大量的模型類。目前,我有以下幾點:

var names = new[] { "Bill", "John", "Jill" }; 
foreach (var name in names) 
{ 
    var blueprints = x.Where(y => y.Name == name).Select(z => z.Value.ToString());  
} 

我知道如何讓chosen值列表的curved集。我知道如何獲得straight集合的beginend值。但是,一旦擁有它們,我不知道該如何處理它們。我想弄清楚如何創建一個動態的C#對象,我可以序列化爲JSON並將其放置在視圖中。我錯過了什麼?我覺得有點卡住了。

回答

1

我建議你必須做下列事情。

創建班級。

public class Options 
{ 
    public Options() 
    { 
    } 

    public Options(List<int> d,string approach) 
    { 
     if (approach == "straight") 
     { 
      begin = d.Min(); 
      end = d.Max(); 
     } 
     else if (approach == "curved") 
     { 
      choosen = d.Select(cc => cc).ToArray(); 
     } 
    } 

    public int? begin { get; set; } 
    public int? end { get; set; } 
    public int[] choosen { get; set; } 
} 

和您的LINQ查詢

var result = (from item in x 
          group item by new { item.Name, item.Approach } into g 
          select new 
          { 
           name = g.Key.Name, 
           approach = g.Key.Approach, 
           options = new Options(g.Select(cc => Convert.ToInt32(cc.Value)).ToList(), g.Key.Approach) 
          }).ToList(); 

      string value = Newtonsoft.Json.JsonConvert.SerializeObject(result, new Newtonsoft.Json.JsonSerializerSettings() { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore }); 
+0

像這樣的東西可能是做到這一點的最好辦法。 –

1

如果您非常喜歡,可以使用匿名類型構造您要查找的數據結構。假設你的「藍圖」存儲在myBluePrints

var toBeSerialized = myBlueprints 
    .GroupBy(bp => new {bp.Name, bp.Approach}) 
    .Select(bpg => new 
    { 
     name = bpg.Key.Name, 
     approach = bpg.Key.Approach, 
     options = new 
     { 
      begin = bpg.Min(bp => bp.Value), 
      end = bpg.Max(bp => bp.Value) 
     } 
    }); 

這麼說,我覺得建立,這將是隻寫對應options一類最簡單的方法,以及對應於頂級藍圖對象類你的數組。換句話說,你試圖避免的「大量模型類」(兩個,特別是)可能是解決這個問題的最簡單的方法。