2016-11-07 185 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

'的問題o [0]'沒有'metrics'屬性。再看看你的結構。事實上,你甚至沒有有效的JSON開始。 –

+0

@MattBurland不會是o [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

這是否也是他們? –

+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));