Правильно спарсить JSON С#ом

ial1408

Client
Регистрация
26.07.2016
Сообщения
194
Благодарностей
18
Баллы
18
Всем доброго времени суток. Только начал изучать Json и столкнулся с такой проблемой. Надо взять каждый id и name Токена statuses в
Код:
{
"_links":
{
"self":
{
"href":"\/api\/v2\/account?with=pipelines","method":"get"}},"id":7620954,"name":"\u041f\u0410\u041a","subdomain":"pak","currency":"RUB","timezone":"Europe\/Moscow","timezone_offset":"+03:00","language":"ru","date_pattern":
{
"date":"d.m.Y","time":"H:i","date_time":"d.m.Y H:i","time_full":"H:i:s"},"current_user":217308,"_embedded":
{
"pipelines":
{
"11865":
{
"id":11865,"name":"\u0412\u043e\u0440\u043e\u043d\u043a\u0430","sort":1,"is_main":true,"statuses":
{
"7620958":
{
"id":7620958,"name":"\u0417\u0430\u044f\u0432\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430","color":"#87f2c0","sort":10,"is_editable":true},"21523572":
{
"id":21523572,"name":"\u041d\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u043e\u0437\u0432\u043e\u043d\u0430","color":"#ebffb1","sort":20,"is_editable":true},"9078438":
{
"id":9078438,"name":"\u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d","color":"#fffd7f","sort":30,"is_editable":true},"9078441":
{
"id":9078441,"name":"\u0426\u0435\u043d\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430","color":"#fff000","sort":40,"is_editable":true},"7620962":
{
"id":7620962,"name":"\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0437\u0432\u0443\u0447\u0435\u043d\u043e","color":"#ffce5a","sort":50,"is_editable":true},"9081087":
{
"id":9081087,"name":"\u0423\u0441\u0442\u043d\u043e\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e","color":"#ffdbdb","sort":60,"is_editable":true},"8314682":
{
"id":8314682,"name":"\u041f\u0440\u0435\u0434\u043e\u043f\u043b\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430","color":"#d6eaff","sort":70,"is_editable":true},"9078444":
{
"id":9078444,"name":"\u041f\u043e\u043b\u043d\u0430\u044f \u043e\u043f\u043b\u0430\u0442\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430","color":"#c1e0ff","sort":80,"is_editable":true},"9078453":
{
"id":9078453,"name":"\u0422\u043e\u0432\u0430\u0440 \u043e\u0442\u0433\u0440\u0443\u0436\u0435\u043d","color":"#ccc8f9","sort":90,"is_editable":true},"9078447":
{
"id":9078447,"name":"\u0412\u044b\u044f\u0432\u043b\u0435\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430","color":"#f2f3f4","sort":100,"is_editable":true},"142":
{
"id":142,"name":"\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e","color":"#CCFF66","sort":10000,"is_editable":false},"143":
{
"id":143,"name":"\u0417\u0430\u043a\u0440\u044b\u0442\u043e \u0438 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e","color":"#D5D8DB","sort":11000,"is_editable":false}},"_links":
{
"self":
{
"href":"\/api\/v2\/pipelines?id=11865","method":"get"}}}}}}
Я написал короткий сниппет:

Код:
JObject JsonParseObject = JObject.Parse(project.Variables["pipelines"].Value);
IEnumerable<JToken> userTokens = JsonParseObject.SelectTokens("statuses[*]", false);
project.SendWarningToLog(String.Format("Статусов в ответе на запрос: {0}", userTokens.Count()), true);
foreach (JToken jsonToken in userTokens){
    string strIdStatus = (string)JsonParseObject.SelectToken("id");
    string strNameStatus = (string)JsonParseObject.SelectToken("name");
    project.SendInfoToLog(strIdStatus + Environment.NewLine);
    project.SendInfoToLog(strNameStatus + Environment.NewLine);
}
Он мне ничего не выдает так как не видит этот Токен

если поменять в коде выше вторую строку на эту:

Код:
IEnumerable<JToken> userTokens = JsonParseObject.SelectTokens("", false);
То он выдает всего один токен того же уровня с искомым мною (как я понимаю) где ответ id будет 7620954 а name = ПАК.
Помогите разобраться люди добрые

PS Забыл уточнить. Использую библиотеку Newtonesoft.JSON.dll
 
Последнее редактирование:

Alex733

Client
Регистрация
27.11.2017
Сообщения
330
Благодарностей
243
Баллы
43
C#:
//Загружаем Json из строки
project.Json.FromString(jsonString);
var obj = project.Json;
//Грузим Json в объект словарь
Dictionary<string,string> jsonDict = obj.GetType().GetMethod("GetAllMembersList").Invoke(obj,null);
// Перебираем все значения и выводим нужное
foreach(var el in jsonDict){
    tmp = el.Key;
// для лучшего понимания, что происходит, выводим все в журнал, предварительно заглянув в переменные -> Json
project.SendInfoTolog(string.Format("key: {0} ;  value {1}; ", el.Key, el.Value);
// После въезжания в смысл, убираем предыдущую строчку, что бы не захламлять лог.
}
 
Последнее редактирование:

ial1408

Client
Регистрация
26.07.2016
Сообщения
194
Благодарностей
18
Баллы
18

Alex733

Client
Регистрация
27.11.2017
Сообщения
330
Благодарностей
243
Баллы
43
Надеюсь, редакция поможет. :-)
Это решение было найдено в недрах форума.
 

ial1408

Client
Регистрация
26.07.2016
Сообщения
194
Благодарностей
18
Баллы
18
Нашел ответ. Отвечу сам себе, может кому то поможет. Надо изучать JSONPath. Следующий код работает:
Код:
JObject JsonParseObject = JObject.Parse(project.Variables["cfg_account"].Value);
IEnumerable<JToken> userTokens = JsonParseObject.SelectTokens("$..statuses.*", false);
project.SendWarningToLog(String.Format("Статусов в ответе на запрос: {0}", userTokens.Count()), true);
foreach (JToken jsonToken in userTokens){
    string strIdStatus = (string)jsonToken.SelectToken("id");
    string strNameStatus = (string)jsonToken.SelectToken("name");
    project.SendInfoToLog(strIdStatus + Environment.NewLine);
    project.SendInfoToLog(strNameStatus + Environment.NewLine);
}
 
  • Спасибо
Реакции: evgen_po и Koqpe

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)