Измените текст ключа JSON в контроллере MVC2, который возвращает JsonResult

Я создаю небольшое количество JSON "Веб-сервисов", используя JsonResult как часть большого приложения MVC2, веб-сервисы будут использоваться приложением iPhone. Разработчик приложения предложил сокращать имена ключей, чтобы уменьшить количество данных, передаваемых по мобильной сети. В настоящее время у меня есть несколько классов, которые я возвращаю с MVC JsonResult, например, PrimaryCategories Class:

public class PrimaryCategory
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Image { get; set; }
    public List<long> SubCategories { get; set; }
    public bool IsVisible { get; set; }
}

При заполнении и возврате через JsonResult возвращается следующее:

[
    {
        "Id":1,
        "Name":"Animals",
        "Image":"/Content/Categories/1.png",
        "SubCategories":[8,9,10],
        "IsVisible":true
    },
    {
        "Id":2,
        "Name":"Birds",
        "Image":"/Content/Categories/2.png",
        "SubCategories":[11,12,13],
        "IsVisible":true
    }
]

Существует ли какой-либо встроенный способ пометки свойств атрибутами или предоставления JavaScriptSerializer метаданных для обеспечения сопоставления между сокращенными именами свойств и длинными именами свойств, так что возвращается следующее:

[
    {
        "id":1,
        "n":"Animals",
        "img":"/Content/Categories/1.png",
        "sc":[8,9,10],
        "vis":true
    },
    {
        "id":2,
        "n":"Birds",
        "img":"/Content/Categories/2.png",
        "sc":[11,12,13],
        "vis":true
    }
]

В настоящее время мое лучшее решение - пометить каждое из свойств с помощью ScriptIgnore, а затем предоставить второй набор свойств, которые используют свойства с длинными именами в качестве резервного хранилища:

public class PrimaryCategory
{
    [ScriptIgnore]
    public long Id { get; set; }

    [ScriptIgnore]
    public string Name { get; set; }

    // etc.

    public long id
    {
        get { return Id; }
        set { Id = value; }
    }

    public string n
    {
        get { return Name; }
        set { Name = value; }
    }

    // etc.
}

Это кажется слишком многословным. Моей первой мыслью было, что, возможно, существует атрибут, похожий на [ScriptIgnore], который позволил бы мне указать имя для ключа JSON, однако я не могу найти его в MSDN или через Reflector. Мое второе предпочтение было бы ввести (я использую NInject для своих собственных классов) альтернативный сериализатор JavaScript для MVC2, чтобы использовать, который поддерживает такой атрибут, однако:

  1. Я не знаю, где начать вводить альтернативный JavaScriptSerializer для использования MVC
  2. Могу ли я каким-то образом расширить существующий класс JavaScriptSerializer, он, похоже, не открыт для расширения и не реализует интерфейс или не наследует что-либо (кроме Object).

Любая помощь, комментарии и советы приветствуются.

1 ответ

Решение

Почему бы просто не выделить в анонимный объект с соответствующими именами? Или, если вы делаете это во многих местах, используйте класс для конкретного вида с короткими именами, который будет использоваться в качестве результата. Затем сериализуйте анонимный объект (или класс представления) вместо вашей бизнес-сущности.

var categories = primaryCategories.Select( pc => new
                 {
                     id : pc.Id,
                     n  : pc.Name,
                     img: pc.Image,
                     sc : pc.SubCategories,
                     vis: pc.IsVisible
                 });

return Json( categories );
Другие вопросы по тегам