Измените текст ключа 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, чтобы использовать, который поддерживает такой атрибут, однако:
- Я не знаю, где начать вводить альтернативный JavaScriptSerializer для использования MVC
- Могу ли я каким-то образом расширить существующий класс 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 );