JSON в C#. Не забирает значение

prozen

Client
Регистрация
20.07.2017
Сообщения
20
Благодарностей
2
Баллы
3
Есть JSON следующего вида:
{"321298":{"start_count":"1011","status":"Completed","remains":"0","currency":"USD"},"424142":{"start_count":null,"status":"Processing","remains":"100","currency":"USD"},"121721":{"start_count":null,"status":"Processing","remains":"687","currency":"USD"},"424563":{"start_count":null,"status":"Processing","remains":"484","currency":"USD"}}

Хочу взять значение 321298.status в C#. Через кубик работает когда добавляю такой код: {-Json.321298.status-}.

В C# По идее код должен выглядеть вот так: return project.Json.321298.status;
Ошибка при таком варианте: "Компиляция кода Ошибка в действии "CS1002" "ожидалась ;". "

Пробовал другие варианты через замену текста на переменную и многие другие, не работает. С десериализацией совсем не подружился, хотя много чего прочитал. Не понял как это поставить и работать с ним.

Вероятно проблема именно в том, что используют числа как первый идентификатор. Просьба помочь забрать значение из JSON в C# для этого случая. Уже не первый раз натыкаюсь на эту проблему и не могу решить.
Спасибо!)
 

prozen

Client
Регистрация
20.07.2017
Сообщения
20
Благодарностей
2
Баллы
3
Похоже на текущий момент встроенное в ZennoPoster решение обработки JSON для C# некорректно воспринимает цифры в качестве ключа. То есть project.Json.321298.status считывается некорректно, но если заменить "321298" на "abv321298", то цифры переходят из числового формата в string и ключ считывается корректно. Было бы круто, если встроенное решение пофиксили.
 

Alex733

Client
Регистрация
27.11.2017
Сообщения
316
Благодарностей
230
Баллы
43
  • Спасибо
Реакции: Metrix, prozen и Zoolone

prozen

Client
Регистрация
20.07.2017
Сообщения
20
Благодарностей
2
Баллы
3
О, большое спасибо! Это именно то, что я искал.

Уже успел к этому времени немного разобрать что такое Словарь и как с ним работать.
Раз узнал, напишу тут краткую инструкцию для тех, кому пригодятся словари или работа через него с JSON.

Словарь (Dictionary) - это по сути структурированный набор данных, к которым можно обращаться по определенным ключам. Ключи мы задаем сами.
Словарь всегда инициализируется через Dictionary<key, value>, где key - ключ через который мы обращаемся к словарю, valuу - значение. Вместо key и value прописываем нужный вам формат данных, например, Dictionary<string, object>. Тогда ключ будет состоять из значений типа string, а значения из object.

Пример инициализации:
Код:
string json_str = "{"321298":{"start_count":"1011","status":"Completed","remains":"0","currency":"USD"},"424142":{"start_count":null,"status":"Processing","remains":"100","currency":"USD"}"; // Сюда заносим JSON строку, можно из переменной
var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); //тут происходит магия конвертации JSON в читаемый формат для словаря
Dictionary<string,object> dict = json_serializer.Deserialize<Dictionary<string,object>>(json_str); //Создается словарь dict, в котором есть ключ в формате string и значение object
JSON можно добавлять в словарь через JavaScriptSerializer. Для начала нужно подключить в GAC System.Web.Extensions.dll. Ищем в разделе "Ссылки из GAC" по названию System.Web.Extensions и добавляем. На этому все, ничего больше подключать не нужно.

Далее мы можем создать еще один словарь из этого словаря и обратиться к его элементам:
Код:
string order = "321298";
Dictionary<string,object> order_list = (Dictionary<string,object>)dict[order]; //создали словарь более низкого уровня, с возможностью обратиться к элементам объекта "321298";
string order_status = Convert.ToString( order_list["status"] ); // Конвертируем в string, потому что изначально формат object. В данном случае получаем значение "Completed"
string order_remaines = Convert.ToString( order_list["remains"] ); // Тут получаем значение "0"
Еще один пример работы со словарем через key и value.

Код:
var obj = project.Json; //Грузим Json в объект словарь из проекта
Dictionary<string,string> jsonDict = obj.GetType().GetMethod("GetAllMembersList").Invoke(obj,null); // тут создаем словарь в котором ключ и значение в формате string
//Далее пробегаем по всем "строкам" словаря jsonDict и заносим его значения в переменную "el"
foreach(var el in jsonDict){         
var text = string.Format("{0}:{1}", el.Key, el.Value); //В первом цикле в переменную text будет положено значение 321298.start_count:1011 , где "321298.start_count" - ключ, а "1011" - значение.
project.SendInfoToLog(string.Format(@"{0}",text), message); //Выведится соответственно значение "321298.start_count:1011"
};
P.S. Не ругайте за говнокод, я новичок) Рад, если кому помог в чем-то разобраться
 
  • Спасибо
Реакции: gevolushn

prozen

Client
Регистрация
20.07.2017
Сообщения
20
Благодарностей
2
Баллы
3
Так будет работать:

C#:
return project.Json.GetMember ( "321298" ).status;
К сожалению, данный метод не работает на длинных числах. Говорит, что невозможно перевести long в int.


P.S. Извиняюсь, моя ошибка. Работает метод на длинных числах.
 
Последнее редактирование:

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