распарсить json в C#

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
Приветствую всех!

Подскажите, пожалуйста, изменилось ли что-нибудь с разбором JSON после 2014 года?

Нашел сообщение на форуме, почти то, что нужно, только не создаются переменные как в примере по этой ссылке: http://zennolab.com/discussion/threads/json-i-c.16858/#post-105329

Мне нужно из такого ответа {"response":1,"tzid":1058850}
положить в созданную мной переменную tzid в экшене C# значение tzid, делал так:

1. Создал GET запрос, который возвращает ответ {"response":1,"tzid":1058850} и кладёт его в переменную get_tzid.
2. Создал экшн C# с таким содержимым:

PHP:
string json_str = project.Variables["get_tzid"].Value;
var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> dict = json_serializer.Deserialize<Dictionary<string,object>>(json_str);
foreach( string s in dict.Keys ){
    project.Variables[s].Value = (string)dict[s];
}
return 1;
Я так понимаю должны были создаться и заполниться переменные response и tzid, но они не создались в списке переменных и не заполнились.

Что я делаю не так, подскажите, пожалуйста, кто может)
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Переменнные нельзя создавать из кода. Они должны уже быть созданы
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
Переменнные нельзя создавать из кода. Они должны уже быть созданы
Создал сейчас переменные response и tzid, попробовал выполнить такой код:

Код:
пробовал так: string json_str = '{"response":1,"tzid":1058955}'; и так: string json_str = "{\"response\":1,\"tzid\":1058955}";
var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> dict = json_serializer.Deserialize<Dictionary<string,object>>(json_str);
foreach( string s in dict.Keys ){
    project.Variables.Value = (string)dict;
}
return 1;
появляется уведомление "проект выполнен с ошибкой" в первом случае и "действие не выполнено" во втором случае, что же делаю не так?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
System.Web в GAC добавлен?
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
System.Web в GAC добавлен?
Создал новый проект сейчас, сделал следующее:
1. Добавить действие - свой код - ссылки GAC - нашел там System.Web 64, добавил его двойным кликом.
2. Создал в окне переменных 2 переменные response и tzid.
3. Добавить действие - свой код - C# код, вставил в него следующее содержимое:

Код:
string json_str = "{\"response\":1,\"tzid\":1058955}";
var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> dict = json_serializer.Deserialize<Dictionary<string,object>>(json_str);

foreach( string s in dict.Keys ){
    project.Variables.Value = (string)dict;
}

return 1;
После выполнения проекта опять уведомление "проект выполнен с ошибкой"..
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
project.Variables.Value = (string)dict;

изза этого подозреваю.
имени переменной нет
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
project.Variables.Value = (string)dict;

изза этого подозреваю.
имени переменной нет
Код:
попробовал сделать так: project.Variables.Value = (string)dict["tzid"];
и так:
project.Variables[s].Value =(string)dict[s];

Безрезультатно, та же ошибка возникает.(
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
project.Variables.Value = (string)dict;

изза этого подозреваю.
имени переменной нет
В логе:

Код:
2015-09-17 11:45:07.8654|WARN|ZennoLab.LogLibrary.InternalError|Ошибка в модуле "Компиляция кода действия id: 12c1bee4-dfc4-4403-af99-b613f3ecc14e группы действий id: 1b294e80-f982-4fc0-b784-ff0e1610218c"
Сообщение: "Ошибка в действии "CS0234" "Имя типа или пространства имен "Script" отсутствует в пространстве имен "System.Web" (пропущена ссылка на сборку?)". [Строка: 1; Cтолбец: 38]"
Может проект прикрепить сюда?
 
Последнее редактирование:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
using System.Web в юзинги пропили?
 
  • Спасибо
Реакции: bhairava7

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
using System.Web в юзинги пропили?
Если не сложно, подскажите, пожалуйста, где это делается)
Я просто новичок, что-то нигде не могу найти такое)
Делал вот такое:
1. Добавить действие - свой код - ссылки GAC - нашел там System.Web 64, добавил его двойным кликом.
При этом система у меня вин 8 64-х разрядная.
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
using System.Web в юзинги пропили?
Сейчас нашел юзинги) добавил туда так: using System.Web;
но всё-равно не хочет выполняться, пишет тоже самое, проект выполнен с ошибками.

ProjectMaker перезагружал после этого.

Прикрепил на всякий случай сам проект.
 

Вложения

Последнее редактирование:

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
using System.Web в юзинги пропили?
Подключил System.Web.Extentions, теперь в логах такое сообщение:

2015-09-17 13:40:11.8978|WARN|ZennoLab.LogLibrary.InternalError|Ошибка в модуле "Выполнение действия CSharp OwnCode id: 56681704-b2f9-4cf3-910d-713c847e9374 группы действий id: 74e40ebe-24df-42b6-b8a3-bcd1ace79c19"
Сообщение: "Не удалось привести тип объекта "System.Int32" к типу "System.String"."
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
using System.Web в юзинги пропили?
Теперь заработало, после того как в строке json значения обрамил кавычками, но как быть с цифровыми значениями, которые не обрамлены в кавычки на сервере, который отдаёт данные в json? Я не имею доступа к нему)

Вот такой код работает:

Код:
var json_str = "{\"response\":\"1\",\"tzid\":\"2058955\"}"; // с таким форматом работает
var json_str = "{\"response\":1,\"tzid\":2058955}"; // а с этим нет

var json_serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> dict = json_serializer.Deserialize<Dictionary<string,object>>(json_str);
foreach( string s in dict.Keys ){
    project.Variables[s].Value = (string)dict[s];
}

return 1;
 

bhairava7

Client
Регистрация
18.08.2015
Сообщения
154
Благодарностей
15
Баллы
18
Последнее редактирование:

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
291
Баллы
63
Всё, разобрался наконец сам)
Благодарю за помощь!

Решение было в следующей строке:
Код:
project.Variables[s].Value = (string)dict[s].ToString();
В результате в каждую переменную попадает значение ключа с именем как у переменной?
 

bhairava7

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

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
291
Баллы
63
да, только предварительно нужно завести эти переменные! :-)
Делаю также, но просто кладу весь результат в кучу, чтоб просто посмотреть
Код:
var jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
Dictionary<string,object> data = jsonSerializer.Deserialize<Dictionary<string,object>>(jsonInput);//jsonInput - тут входящий json
         
string screen_name = "";
foreach (string item in data.Keys)
{
    screen_name += (string)data[item].ToString();
}
return screen_name;
В результате возвращает System.Collections.Generic.Dictionary'2[System.String,System.Object]
Где накосячил?)
 
Последнее редактирование:

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
291
Баллы
63
@bhairava7, с твоим json отработал как надо, а вот с этим не получается:
"{"error":{"error_code":5,"error_msg":"User authorization failed: no access_token passed.","request_params":[{"key":"oauth","value":"1"},{"key":"method","value":"account.getInfo"},{"key":"fields","value":"country"},{"key":"v","value":"5.40"}]}}"

Можно как-нибудь подстроить?
 

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