2016-11-07 6 views
1

Мне интересно, как я могу получить сумму ответа JSON:Сумма вложенных свойств объекта

Я пытаюсь получить сумму Поставленный таким образом, было бы 3435 + 20.

{[ 
    { 
    "date": "2016-10-01", 
    "stats": [ 
     { 
     "type": "subuser", 
     "name": "[email protected]", 
     "metrics": { 
      "blocks": 23, 
      "bounce_drops": 164, 
      "bounces": 19, 
      "clicks": 0, 
      "deferred": 412, 
      "delivered": 3435, 
      "invalid_emails": 27, 
      "opens": 0, 
      "processed": 3481, 
      "requests": 3675, 
      "spam_report_drops": 3, 
      "spam_reports": 0, 
      "unique_clicks": 0, 
      "unique_opens": 0, 
      "unsubscribe_drops": 0, 
      "unsubscribes": 0 
     } 
     } 
    ] 
    }, 
    { 
    "date": "2016-10-02", 
    "stats": [ 
     { 
     "type": "subuser", 
     "name": "[email protected]", 
     "metrics": { 
      "blocks": 0, 
      "bounce_drops": 0, 
      "bounces": 0, 
      "clicks": 0, 
      "deferred": 95, 
      "delivered": 20, 
      "invalid_emails": 0, 
      "opens": 0, 
      "processed": 0, 
      "requests": 0, 
      "spam_report_drops": 0, 
      "spam_reports": 0, 
      "unique_clicks": 0, 
      "unique_opens": 0, 
      "unsubscribe_drops": 0, 
      "unsubscribes": 0 
     } 
     } 
    ] 
    } 
]} 

Смогу ли я сделать что-то подобное? Я попытался сделать это, но он не работает Я получаю ошибку:

Additional information: Cannot perform runtime binding on a null reference

 string getresponse; 

     getresponse = response.Body.ReadAsStringAsync().Result; 

     string s = getresponse; 

     dynamic o = JsonConvert.DeserializeObject(s); 

     textBox1.Text = o[0].stats[0].metrics[0].delivered; 
+1

'о [0]' не имеет 'metrics' недвижимость , Посмотрите на свою структуру снова. На самом деле, у вас даже нет действительного JSON для начала. –

+0

@MattBurland Не было бы [[0] .stats [0] .metrics [0] .delivered; ?? –

ответ

1

metrics свойства является словарем, поэтому вам нужно получить доступ к его значению с помощью ключа.

dynamic result = JsonConvert.DeserializeObject<dynamic>(jsonString); 
var res = result[0].stats[0].metrics["delivered"]; 

Законченное редактирование: вам необходимо создать классы для правильного десериализации этого json.

public class Rootobject 
    { 
     public string date { get; set; } 
     public Stat[] stats { get; set; } 
    } 

    public class Stat 
    { 
     public string type { get; set; } 
     public string name { get; set; } 
     public Metrics metrics { get; set; } 
    } 

    public class Metrics 
    { 
     public int blocks { get; set; } 
     public int bounce_drops { get; set; } 
     public int bounces { get; set; } 
     public int clicks { get; set; } 
     public int deferred { get; set; } 
     public int delivered { get; set; } 
     public int invalid_emails { get; set; } 
     public int opens { get; set; } 
     public int processed { get; set; } 
     public int requests { get; set; } 
     public int spam_report_drops { get; set; } 
     public int spam_reports { get; set; } 
     public int unique_clicks { get; set; } 
     public int unique_opens { get; set; } 
     public int unsubscribe_drops { get; set; } 
     public int unsubscribes { get; set; } 
    } 

После этого вы можете получить сумму, как это:

var result = JsonConvert.DeserializeObject<List<Rootobject>>(jsonString); 
var sum = result.SelectMany(x => x.stats).Sum(x => x.metrics.delivered); 
+0

Это тоже SUM? –

+0

извините, не видел этого, я скоро отредактирую свой ответ –

+0

@JDoe. это должно быть –

0
public class Metrics 
    { 
     public int delivered { get; set; } 
    } 

    public class Stat 
    { 
     public Metrics metrics { get; set; } 
    } 

    public class RootObject 
    { 
     public List<Stat> stats { get; set; } 
    } 

..

 List<RootObject> o = JsonConvert.DeserializeObject<List<RootObject>>(json); 
     var result = o.Sum(x => x.stats.Sum(y => y.metrics.delivered));