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

  • Автор темы Автор темы bhairava7
  • Дата начала Дата начала

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, но они не создались в списке переменных и не заполнились.

Что я делаю не так, подскажите, пожалуйста, кто может)
 
Переменнные нельзя создавать из кода. Они должны уже быть созданы
 
Переменнные нельзя создавать из кода. Они должны уже быть созданы

Создал сейчас переменные 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;

появляется уведомление "проект выполнен с ошибкой" в первом случае и "действие не выполнено" во втором случае, что же делаю не так?
 
System.Web в GAC добавлен?
 
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;

После выполнения проекта опять уведомление "проект выполнен с ошибкой"..
 
project.Variables.Value = (string)dict;

изза этого подозреваю.
имени переменной нет
 
project.Variables.Value = (string)dict;

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

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

Безрезультатно, та же ошибка возникает.(
 
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]"

Может проект прикрепить сюда?
 
Последнее редактирование:
using System.Web в юзинги пропили?
 
  • Оценить
Реакции: bhairava7
using System.Web в юзинги пропили?
Если не сложно, подскажите, пожалуйста, где это делается)
Я просто новичок, что-то нигде не могу найти такое)
Делал вот такое:
1. Добавить действие - свой код - ссылки GAC - нашел там System.Web 64, добавил его двойным кликом.
При этом система у меня вин 8 64-х разрядная.
 
using System.Web в юзинги пропили?
Сейчас нашел юзинги) добавил туда так: using System.Web;
но всё-равно не хочет выполняться, пишет тоже самое, проект выполнен с ошибками.

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

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

Вложения

  • json.xmlz
    json.xmlz
    12,3 KB · Просмотры: 26
Последнее редактирование:
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"."
 
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;
 
using System.Web в юзинги пропили?
Всё, разобрался наконец сам)
Благодарю за помощь!

Решение было в следующей строке:
Код:
Развернуть Свернуть Копировать
project.Variables[s].Value = (string)dict[s].ToString();
 
Последнее редактирование:
Всё, разобрался наконец сам)
Благодарю за помощь!

Решение было в следующей строке:
Код:
Развернуть Свернуть Копировать
project.Variables[s].Value = (string)dict[s].ToString();
В результате в каждую переменную попадает значение ключа с именем как у переменной?
 
да, только предварительно нужно завести эти переменные! :-)
Делаю также, но просто кладу весь результат в кучу, чтоб просто посмотреть
Код:
Развернуть Свернуть Копировать
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]
Где накосячил?)
 
Последнее редактирование:
@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"}]}}"

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

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