2016-11-19 4 views
0

У меня есть этот код ниже, который получает ответ JSON от вызова API.Ошибка при анализе ответа JSON

Я сериализую его, и я пытаюсь использовать Linq для получения определенного родительского узла и поиска по этому узлу, чтобы найти конкретный текст.

HttpClient client = new HttpClient(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
HttpResponseMessage response = client.GetAsync(some url).Result; 
string strJson = response.Content.ReadAsStringAsync().Result; 
object jObj = (JObject)JsonConvert.DeserializeObject(strJson); 
Assert.IsTrue(response.IsSuccessStatusCode.Equals(true)); 
var a = JArray.Parse(jObj.ToString()); 
var Cast = a.SelectMany(x => x["episodes"]); 

Я получаю сообщение об ошибке:

Object is not Json Array

Любые идеи о том, как я мог это сделать?

Json ответ

{ 
"cast": [ 
    { 
     "character": "Eddard Stark", 
     "credit_id": "5256c8ad19c2956ff60478a6", 
     "id": 48, 
     "name": "Sean Bean", 
     "profile_path": "/iIxP2IzvcLgr5WaTBD4UfSqaV3q.jpg", 
     "order": 0 
    }, 
    { 
     "character": "Jon Snow", 
     "credit_id": "5256c8af19c2956ff6047af6", 
     "id": 239019, 
     "name": "Kit Harington", 
     "profile_path": "/dwRmvQUkddCx6Xi7vDrdnQL4SJ0.jpg", 
     "order": 0 
    } 
    ], 
    "crew": [ 
    { 
     "id": 93223, 
     "credit_id": "5256c8a219c2956ff6046f0b", 
     "name": "Brian Kirk", 
     "department": "Directing", 
     "job": "Director", 
     "profile_path": null 
    }, 
    { 
     "id": 59984, 
     "credit_id": "54eef41d9251417971005b8d", 
     "name": "Marco Pontecorvo", 
     "department": "Camera", 
     "job": "Director of Photography", 
     "profile_path": null 
    }, 
    { 
     "id": 1204180, 
     "credit_id": "54eef453c3a3680b80006153", 
     "name": "Frances Parker", 
     "department": "Editing", 
     "job": "Editor", 
     "profile_path": null 
    }, 
    { 
     "id": 9813, 
     "credit_id": "5256c8a019c2956ff6046e2b", 
     "name": "David Benioff", 
     "department": "Writing", 
     "job": "Writer", 
     "profile_path": "/8CuuNIKMzMUL1NKOPv9AqEwM7og.jpg" 
    }, 
    { 
     "id": 228068, 
     "credit_id": "5256c8a219c2956ff6046e4b", 
     "name": "D. B. Weiss", 
     "department": "Writing", 
     "job": "Writer", 
     "profile_path": "/caUAtilEe06OwOjoQY3B7BgpARi.jpg" 
    } 
    ] 
} 
+0

Пожалуйста, покажите ваш ответ JSON, это, вероятно, массив, а не прямой объект, который вы получаете. С * «Я сериализую его» * ​​Я понимаю, что вы означали * deserialized * – Jim

+0

Извините, что я имел в виду десериализацию. Ответ, который я получаю, ниже – Mayamiko

+0

Json response = содержимое Json, а не ошибка – Jim

ответ

0

Попробуйте это:

JObject jObj = (JObject)JsonConvert.DeserializeObject(strJson); 
Assert.IsTrue(response.IsSuccessStatusCode.Equals(true)); 
var a = (JArray)jObj["cast"]; 

вместо:

object jObj = (JObject)JsonConvert.DeserializeObject(strJson); 
Assert.IsTrue(response.IsSuccessStatusCode.Equals(true)); 
var a = JArray.Parse(jObj.ToString()); 

Это не уже десериализации поэтому нет необходимости разбирать его больше.

Acces в a массив Далее, пример:

foreach (var actor in a) 
{ 
    Console.WriteLine(actor["character"]); 
} 

В качестве альтернативы можно использовать динамическую функциональность:

dynamic jObj = JsonConvert.DeserializeObject(strJson); 
var a = jObj.cast; 
+0

Спасибо - попробовали это, но при отладке он выглядит так, что массив ничего не держит. Он равен нулю. – Mayamiko

+0

Код @Mayamiko проверен и подтвержден как работающий сэр. – Jim

+0

Хорошо - попробуем и отлаживаем. Может быть, я что-то пропустил – Mayamiko

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