#c_sharp #json #vkontakte_api
Хочу вытянуть ID групп ВК, у которых в названии есть буква "а". Отправляю запрос и получаю ответ: { "response":[ 747369, { "gid":60386075, "name":"Мың бір оқиға [K-POP]", "screen_name":"kazanonim", "is_closed":0, "type":"page", "is_admin":0, "is_member":0, "photo":"http:\/\/cs631116.vk.me\/v631116892\/bfa5\/mv5UyEdPfz8.jpg", "photo_medium":"http:\/\/cs631116.vk.me\/v631116892\/bfa4\/EEzzOElvS78.jpg", "photo_big":"http:\/\/cs631116.vk.me\/v631116892\/bfa2\/ktxcZIgNLVU.jpg" }, .... ] } Но дальше у меня проблема, не могу достать правильно данные, если я делаю как в коде ниже, то мне мешает : 747369 - количество групп у которых есть буква "а" в названии. Я не знаю как обработать его, в результате получаю ошибку newtonsoft.json.jsonserializationexception error converting value 747369 ... public void Reader2(string r) { Json2.RootObject groups = JsonConvert.DeserializeObject(r); foreach (var c in groups.items) { textBox1.Text += c.screen_name + Environment.NewLine; } } public class Json2 { public class Item { public int id { get; set; } public string name { get; set; } public string screen_name { get; set; } public int is_closed { get; set; } public string type { get; set; } public int is_admin { get; set; } public int is_member { get; set; } public string photo_50 { get; set; } public string photo_100 { get; set; } public string photo_200 { get; set; } } public class RootObject { public List - items { get; set; } } } Попробовал через http://json2csharp.com/ создать класс: public class RootObject { public List
Ответы
Ответ 1
Необходимые свойства можно найти с помощью JSONPath // #r "\Newtonsoft.Json\6.0.3\lib\net45\Newtonsoft.Json.dll" using Newtonsoft.Json; using Newtonsoft.Json.Linq; var json = System.IO.File.ReadAllText(@"C:\Temp\json.txt"); var jo = JObject.Parse(json); foreach (var o in jo.SelectTokens("..screen_name")) // JSONPath if (o.ToString().Contains("a")) Console.WriteLine(o.Parent.Parent["gid"] + " " + o); Результат 60386075 kazanonim Для следующего json в файле C:\Temp\json.txt { "response":[ 747369, { "gid":60386075, "name":"Мың бір оқиға [K-POP]", "screen_name":"kazanonim", "is_closed":0, "type":"page", "is_admin":0, "is_member":0, "photo":"http:\/\/cs631116.vk.me\/v631116892\/bfa5\/mv5UyEdPfz8.jpg", "photo_medium":"http:\/\/cs631116.vk.me\/v631116892\/bfa4\/EEzzOElvS78.jpg", "photo_big":"http:\/\/cs631116.vk.me\/v631116892\/bfa2\/ktxcZIgNLVU.jpg" } ] }Ответ 2
Перед десериализацией можно получить ответ сервера в виде дерева и отредактировать. Примерно так: var jroot = JObject.Parse(r); var jresponse = (JArray)jroot["response"]; jresponce.RemoveAt(0); var root = jroot.ToObject(); Если же это число также нужно, то можно поступить так: public class RootObject { public List response { get; set; } } // ... Json2.RootObject groups = JsonConvert.DeserializeObject (r); foreach (var c in groups.response) { if (c is JObject) { var item = c.ToObject (); // ... } if (c is JValue) { var count = (int)c; // ... } }
Комментариев нет:
Отправить комментарий