Изменить текст ключа JSON в контроллере MVC2, который возвращает JsonResult - PullRequest
0 голосов
/ 24 декабря 2010

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

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 Ответ

3 голосов
/ 24 декабря 2010

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

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

return Json( categories );
...