2014-10-23 6 views
3

Должно быть просто! Как я могу выполнить следующее?JsonConvert.Deserialize JsonResult от MVC Action

JsonResult result = JsonConvert.Deserialize(CheckPlan()); 

Где CheckPlan() возвращает это:

return Json(new { success = success }, JsonRequestBehavior.AllowGet); 

Я не могу разобрать успеха логическое значение, возвращаемое JsonResult. Я попытался поставить <Dictionary<string,string>> сразу после Deserialize, но это было не по синтаксису. Используется как тип против переменной и т. Д. И т. Д.

Каков правильный способ сделать это?

ответ

2

Предполагая, что вы используете .NET 4.0 или выше, вы можете использовать dynamic:

dynamic result = JsonConvert.DeserializeObject((string)CheckPlan().Data); 

Console.WriteLine(result.success); 

Если вы не хотите dynamic, вы можете создать пользовательский класс с success Логическим свойством:

public class Foo 
{ 
    [JsonProperty("success")] 
    public bool Success { get; set; } 
} 

И потом:

Foo result = JsonConvert.DeserializeObject<Foo>((string)CheckPlan().Data); 
Console.WriteLine(result.Success); 
+0

Это здорово, и кажется, что он должен работать! но он не будет компилироваться. Вот что я сделал JsonResultSuccess result = JsonConvert.DeserializeObject (CheckPlan()); компилятор говорит, имеет некоторые недопустимые аргументы и не может преобразовать JsonResult в строку. – jallen

+0

Я редактировал код. Должен теперь работать –

+0

'Newtonsoft.Json.JsonConvert.DeserializeObject (string)' не может конвертировать из 'System.Web.Mvc.JsonResult' в 'string' – jallen

1

Я знаю, что это старый ро но я имел точно такую ​​же проблему, которую я решил следующим образом:

Не нужно использовать десериализатор!

dynamic result = CheckPlan().Data;  
Console.WriteLine(result.success); 

В моем случае я писал модульный тест для метода контроллера MVC. Поскольку методы тестирования находятся в собственном проекте, я должен был предоставить им доступ к внутренним компонентам проекта MVC, чтобы dynamic мог получить доступ к свойствам объекта Data результата. Для этого добавьте следующую строку в AssemblyInfo.cs в проекте MVC:

// Allow the test project access to internals of MyProject.Web 
[assembly: InternalsVisibleTo("MyProject.Test")] 
+0

Как у всех есть .Дата в их примере? У меня нет этого всплывающего окна в Intillisense из моего JsonResult? – Sam

Смежные вопросы