2015-05-12 80 views
1

假设我有这个JArray:合并重复达

{ 
    "ArrayofItem":{ 
     "Item":[ 
     { 
      "Amount": "1.52" 
      "Date": "05/01/2015" 
     }, 
     { 
      "Amount": "2.52" 
      "Date": "05/01/2015" 
     }, 
     { 
      "Amount": "5.62" 
      "Date": "05/02/2015" 
     }, 
     { 
      "Amount": "1.06" 
      "Date": "05/02/2015" 
     }, 
     { 
      "Amount": "6.30" 
      "Date": "05/03/2015" 
     }, 
     { 
      "Amount": "1.00" 
      "Date": "05/04/2015" 
     }, 
     { 
      "Amount": "1.55" 
      "Date": "05/04/2015" 
     }, 
     { 
      "Amount": "1.63" 
      "Date": "05/05/2015" 
     }, 
     { 
      "Amount": "1.78" 
      "Date": "05/06/2015" 
     } 
    } 
} 

我怎样才能巩固项目,以便在同一日期的所有项目都结合在一起,形成一个新的JArray这样的:

{ 
    "ArrayofItem":{ 
     "Item":[ 
     { 
      "Amount": "4.04" 
      "Date": "05/01/2015" 
     }, 
     { 
      "Amount": "6.68" 
      "Date": "05/02/2015" 
     }, 
     { 
      "Amount": "6.30" 
      "Date": "05/03/2015" 
     }, 
     { 
      "Amount": "2.55" 
      "Date": "05/04/2015" 
     }, 
     { 
      "Amount": "1.63" 
      "Date": "05/05/2015" 
     }, 
     { 
      "Amount": "1.78" 
      "Date": "05/06/2015" 
     } 
    } 
} 

本质上,我需要按原始项目的日期列表进行汇总。您可以假定这些项目已按日期排序。

+1

似乎需要反序列化放入原始对象结构中,将其修改为新结构并对其进行重新序列化。你试过什么了? –

+0

我编辑了你的标题。请参阅:“[应该在其标题中包含”标签“](http://meta.stackexchange.com/questions/19190/)”,其中的共识是“不,他们不应该”。 –

回答

0

您可以使用下面的代码为你的模型:

public class Rootobject 
{ 
    public Arrayofitem ArrayofItem { get; set; } 
} 

public class Arrayofitem 
{ 
    public Item[] Item { get; set; } 
} 

public class Item 
{ 
    public string Amount { get; set; } 
    public string Date { get; set; } 
} 

,然后这个代码将做的工作:

string jsonText = "your json text goes here...";  
var o = JsonConvert.DeserializeObject<Rootobject>(jsonText); 
var itemArray = o.ArrayofItem.Item 
          .GroupBy(item => item.Date, (date, item) => 
            new Item 
            { 
             Date = date, 
             Amount = item.Sum(i => float.Parse(i.Amount)).ToString() 
            }).ToArray(); 

string serializedGroup = JsonConvert.SerializeObject(new Rootobject { ArrayofItem = new Arrayofitem { Item = itemArray } }); 
0

如果你想与LINQ to JSON纯粹做到这一点,你可以使用GroupBySum创建必要的对象:

 var obj = JObject.Parse(json); 
     var query = obj.SelectTokens("ArrayofItem.Item") 
      .SelectMany(t => t) 
      .OfType<JObject>() 
      .GroupBy(o => o["Date"], o => o["Amount"]) 
      .Select(g => new JObject(new JProperty("Amount", g.Sum(a => (decimal)a)), new JProperty("Date", g.Key))); 
     var newObj = new JObject(new JProperty("ArrayofItem", new JObject(new JProperty("Item", new JArray(query)))));