2015-05-26 7 views
0

я следующий метод в моем contorllerЧтение Json данных C#

public JsonResult Data() 
{ 
    return Json(details 
     .Select(c => new { Height = c.Height, Width = c.Width }) 
     .Distinct(), 
     JsonRequestBehavior.AllowGet); 
} 

Я читаю его данные, как показано ниже

public void ReadData() 
{ 
    var result = controller.Data() as JsonResult; 
    var model = result.Data; 
} 

Как я бросил уаг модель в ReadData правильно?

+0

вы хотите десериализации данных? –

ответ

1

Данные JsonResult будут повторяться и сериализоваться во время вызова jsonResult.ExecuteResult, но если вы просто хотите получить данные json, которые он будет производить, вы можете вручную использовать тот же сериализатор json, который использует JsonResult. Так будет выглядеть следующим образом:

public void ReadData() 
{ 
    var result = controller.Data() as JsonResult; 
    var model = result.Data; 
    JavaScriptSerializer scriptSerializer = new JavaScriptSerializer(); 
    string json = scriptSerializer.Serialize(model); 
} 
+0

Использование Newtonsoft Json было бы лучшим выбором. Для многих сложных типов он работает лучше. –

1

Вы видите System.Linq.Enumerable.DistinctIterator<<>f__AnonymousType2<string,string>>, потому что это именно то, что вы возвращаетесь: перечислимого анонимного типа с двумя строковыми свойствами.

Вы можете перебрать, что:

var model = result.Data; 
foreach (var dimension in model) 
{ 
    int h = dimension.Height; 
    int w = dimension.Width; 
} 

Однако, вы не хотите идти вокруг сериализации и десериализации JSON туда и обратно, если метод API в том же проекте.

Либо ввести конкретный тип (в отличие от анонимного типа) и изменить тип возвращаемого для контроллера API:

public class Dimension 
{ 
    public int Height { get; set; } 
    public int Width { get; set; } 
} 

public IEnumerable<Dimension> Data() 
{ 
     return details.Select(c => new Dimension { Height = c.Height, Width = c.Width }).Distinct(); 
} 

Или поставить логику в своем классе:

public class DimensionGetter 
{ 
    public IEnumerable<Dimension> GetDimensions() 
    { 
     return details.Select(c => new Dimension { Height = c.Height, Width = c.Width }).Distinct(); 
    } 
} 

И назовите этот класс по обоим методам:

public JsonResult Data() 
{ 
    return Json(new DimensionGetter.GetDimensions(), JsonRequestBehavior.AllowGet); 
} 

public void ReadData() 
{ 
    var model = new DimensionGetter.GetDimensions(); 
} 
+0

Когда я пытаюсь foreach, он дает ошибку – Richa

+1

Это хорошо. Вы несете ответственность за эту ошибку? – CodeCaster

0

Вы можете вручную использовать тот же самый json serial izer, который использует JsonResult. Так будет выглядеть следующим образом:

JavaScriptSerializer scriptSerializer = new JavaScriptSerializer(); 
string json = scriptSerializer.Serialize(model); 
-1

Я думаю JavaScriptSerializer() и Serialize сделает работу

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