2017-02-07 2 views
0

Я работаю с OutBrain Api.Вложенный массив в JObject

В моем коде, функция response.Content.ReadAsStringAsync(); возвращает объект JSON, который выглядит следующим образом:

{ 
    "results": [ 
    { 
     "metadata": { 
     "id": "2016-10", 
     "fromDate": "2016-10-01", 
     "toDate": "2016-10-30" 
     }, 
     "metrics": { 
     "impressions": 1164823829, 
     "clicks": 2660235, 
     "conversions": 2228, 
     "spend": 463546.37, 
     "ecpc": 0.17, 
     "ctr": 0.23, 
     "conversionRate": 0.08, 
     "cpa": 208.05 
     } 
    }, 
    { 
     "metadata": { 
     "id": "2016-09", 
     "fromDate": "2016-09-01", 
     "toDate": "2016-09-30" 
     }, 
     "metrics": { 
     "impressions": 959483548, 
     "clicks": 2245759, 
     "conversions": 1777, 
     "spend": 385899.67, 
     "ecpc": 0.17, 
     "ctr": 0.23, 
     "conversionRate": 0.08, 
     "cpa": 217.16 
     } 
    }, 
    { 
     "metadata": { 
     "id": "2016-08", 
     "fromDate": "2016-08-01", 
     "toDate": "2016-08-31" 
     }, 
     "metrics": { 
     "impressions": 980319229, 
     "clicks": 2621017, 
     "conversions": 1818, 
     "spend": 358970.61, 
     "ecpc": 0.14, 
     "ctr": 0.27, 
     "conversionRate": 0.07, 
     "cpa": 197.45 
     } 
    } 
    ], 
    "totalResults": 3, 
    "summary": { 
    "impressions": 3104626606, 
    "clicks": 7527011, 
    "conversions": 5823, 
    "spend": 1208416.65, 
    "ecpc": 0.16, 
    "ctr": 0.24, 
    "conversionRate": 0.08, 
    "cpa": 207.52 
    } 
} 

Я пытаюсь достигнуть данных внутри каждого «метаданных» и «метрики», которые все в " результаты ", но кажется, что мой код не работает.

Мой код:

string responseData = await response.Content.ReadAsStringAsync(); 

        JObject campaignData = JsonConvert.DeserializeObject<dynamic>(responseData); 

        Dictionary<string, dynamic> mediaCampaigns = new Dictionary<string, dynamic>(); 
        if (campaignData != null) 
        { 
         if (campaignData["totalResults"].ToString() != "1" & campaignData["totalResults"].ToString() != "0") 
         { 
          foreach (var campItem in campaignData) 
          { 
           mediaCampaigns.Add(campItem["@results"]["@metadata"]["@fromDate"]ToString(), new 
           { 
            cost = campaignData["@results"]["@metrics"]["@spend"] != null ? campaignData["@results"]["@metrics"]["@spend"] : 0, 
            clicks = campaignData["@results"]["@metrics"]["@clicks"] != null ? campaignData["@results"]["@metrics"]["@clicks"] : 0, 
            impressions = campaignData["@results"]["@metrics"]["@impressions"] != null ? campaignData["@results"]["@impressions"]["@impressions"] : 0, 
            conversions = campaignData["@results"]["@metrics"]["@conversions"] != null ? campaignData["@results"]["@metrics"]["@conversions"] : 0, 
           }); 
          } 
         } 
         else 
         { 
          mediaCampaigns.Add(campaignData["@results"]["@metadata"]["@fromDate"].ToString(), new 
          { 
           cost = campaignData["@results"]["@metrics"]["@spend"] != null ? campaignData["@results"]["@metrics"]["@spend"] : 0, 
           clicks = campaignData["@results"]["@metrics"]["@clicks"] != null ? campaignData["@results"]["@metrics"]["@clicks"] : 0, 
           impressions = campaignData["@results"]["@metrics"]["@impressions"] != null ? campaignData["@results"]["@impressions"]["@impressions"] : 0, 
           conversions = campaignData["@results"]["@metrics"]["@conversions"] != null ? campaignData["@results"]["@metrics"]["@conversions"] : 0, 
          }); 
         } 
        } 

Я хотел бы получить некоторую помощь, спасибо!

+0

Что ошибка вы получаете? – Mahdi

+0

Я просто не могу получить доступ к данным внутри объекта json. петля foreach ничего не помещает в словарь. – Tal

+1

Почему бы вам не десериализовать его в объект? Есть ли какая-то конкретная причина? – Mahdi

ответ

1

В следующем коде RootObject это класс, порожденный this инструмента:

var test = JsonConvert.DeserializeObject<RootObject>(json); 
Dictionary<string, dynamic> mediaCampaigns = new Dictionary<string, dynamic>(); 
foreach (var item in test.results) 
{ 
    mediaCampaigns.Add(item.metadata.fromDate, new 
    { 
     cost = item.metrics.spend, 
     clicks = item.metrics.clicks, 
     impressions = item.metrics.impressions, 
     conversions = item.metrics.conversions 
    }); 
} 

Это работает для меня. Кроме того, измените

ReadAsStringAsync() 

в

ReadAsStringAsync().Result; 
+0

Спасибо! это помогло мне! – Tal

Смежные вопросы