Как я могу изменить способ форматирования JSON в asp.net mvc? - PullRequest
0 голосов
/ 30 декабря 2011

У меня есть модель :

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public List<Color> Colors { get; set; }
}

public class Color
{
    public int ColorId { get; set; }
    public string Name { get; set; }
}

и asp.net MVC return Json(...) дает мне это:

[{"Name":"JC","Age":24,"Colors":[{"ColorId":1,"Name":"Red"},{"ColorId":2,"Name":"Blue"}]},
{"Name":"Albert","Age":29,"Colors":[{"ColorId":2,"Name":"Blue"}]}]

когда я пытаюсь вернуть тип: List<Person>

но я хочу что-то вроде этого (если возможно):

{"People":[{"Name":"JC","Age":24,"Colors":[{"ColorId":1,"Name":"Red"},{"ColorId":2,"Name":"Blue"}]},{"Name":"Albert","Age":83,"Colors":[{"ColorId":2,"Name":"Blue"}]}]}

МОЙ ВОПРОС (ы):

  • Как я могу заставить C # (asp.net mvc) возвращать JSON с лучшим форматом, например: (примечание: игнорировать данные, моя главная мысль - возвращать их с «People» как основная коллекция .. как это сделать? JSON.net?)

    { "Люди": [{ "Имя": "JC", "Возраст": 24, "Цвета": [{ "ColorId": 1, "Имя": "Красный"}, { "ColorId": 2, "Имя": "Голубой"}]}, { "Имя": "Альберт", "Возраст": 83, "Цвета": [{ "ColorId": 2, "Имя": "Синий"}]}]}

  • ИЛИ как мне заставить KNOCKOUT.JS MAPPING PLUGIN работать с этим типом формата JSON? (для тех кто знает нокаут)

    [{ "Имя": "JC", "Возраст": 24, "Цвета": [{ "ColorId": 1, "Имя": "Красный"}, { "ColorId": 2, "Имя" : "Синий"}]}, { "Имя": "Альберт", "Возраст": 29, "Цвета": [{ "ColorId": 2, "Имя": "Синий"}]}]


ОБНОВЛЕНИЕ (дополнительное уточнение / информация):

это мои данные, и я хочу вернуть список

    private List<Person> _people = new List<Person>
                                        {
                                            new Person
                                                {
                                                    Name = "JC",
                                                    Age = 24,
                                                    Colors = new List<Color>
                                                                {
                                                                    Red,
                                                                    Blue,
                                                                }
                                                },
                                            new Person
                                                {
                                                    Name = "Albert",
                                                    Age = 29,
                                                    Colors = new List<Color>
                                                                {
                                                                    Blue
                                                                }
                                                }
                                        };

в формате JSON, подобном следующему:

{"People":[{"Name":"JC","Age":24,"Colors":[{"ColorId":1,"Name":"Red"},{"ColorId":2,"Name":"Blue"}]},
{"Name":"Albert","Age":83,"Colors":[{"ColorId":2,"Name":"Blue"}]}]}

Мне просто интересно, если это возможно, или, если нет, , то как я могу заставить подключаемый модуль knockout.js адаптироваться к способу возврата json в MVC?

Ответы [ 2 ]

3 голосов
/ 30 декабря 2011

Вам нужен контейнер, так как вы не хотите возвращать массив, но объект с переменной People.

Примерно так (с использованием динамического):

var jsonData = new 
            {
                People = _people 
            };
return Json(jsonData, JsonRequestBehavior.AllowGet);

Обновление

JSON - это действительно простой формат. Давайте пропустим все, что вам не нужно сейчас.

  • Объекты: объекты в json начинаются и заканчиваются на {}. Все, что в них соответствует свойствам в C #.
  • Массивы: возвращение IEnumerable вернет массив. Массив может содержать другие массивы, объекты или простые поля.

Приведенный выше код использует динамический объект в C # и может быть преобразован в класс, похожий на этот:

public class MyCustomClass
{
    public IEnumerable<Person> People {get;set;}
}

Следовательно, это объект, возвращающий массив, в результате чего:

{ People: [] }

Где {} соответствует MyCustomClass.

1 голос
/ 30 декабря 2011

вы можете вернуть вещи, например, так:

 var jsonData = new
            {
                Name = qry.Name,
                Age = qry.Age,
                Colors = (
                    from c in qry
                    select new
                    {
                        ColorID = c.ColorID,
                        Name = c.Name
                    }).ToArray()
            };

return Json(jsonData, JsonRequestBehavior.AllowGet);

Может быть, что-то в этом роде:)

...