在返回JsonResult的MVC2控制器中更改JSON键文本
我正在创建少量JSON“Web服务”,作为大型MVC2应用程序的一部分,这些Web服务将由iPhone应用程序使用。该应用程序开发人员建议缩短密钥名称,以减少通过移动网络发送的数据量。我目前有几个类,这些类与MVC JsonResult一起返回,例如PrimaryCategories类:在返回JsonResult的MVC2控制器中更改JSON键文本,json,asp.net-mvc-2,asp.net-4.0,javascriptserializer,Json,Asp.net Mvc 2,Asp.net 4.0,Javascriptserializer,我正在创建少量JSON“Web服务”,作为大型MVC2应用程序的一部分,这些Web服务将由iPhone应用程序使用。该应用程序开发人员建议缩短密钥名称,以减少通过移动网络发送的数据量。我目前有几个类,这些类与MVC JsonResult一起返回,例如PrimaryCategories类: public class PrimaryCategory { public long Id { get; set; } public string Name { get; set; }
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; }
}
是否有一些内置方法可以使用属性标记属性,或者向JavaScriptSerializer提供元数据,以提供缩写属性名和长属性名之间的映射,从而返回以下内容:
[
{
"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
}
]
[
{
"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
}
]
目前,我的最佳解决方案是使用标记每个属性,然后提供第二组使用长名称属性作为备份存储的属性:
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找到一个名称。我的第二个偏好是为MVC2注入一个替代的JavaScript序列化程序(我在自己的类中使用NInject),该序列化程序支持这样一个属性,但是:
感谢您的帮助、评论和建议。为什么不选择一个具有适当名称的匿名对象?或者,如果您在许多地方都这样做,则使用一个具有短名称的视图特定类作为结果。然后序列化匿名对象(或视图类),而不是您的业务实体
var categories = primaryCategories.Select( pc => new
{
id : pc.Id,
n : pc.Name,
img: pc.Image,
sc : pc.SubCategories,
vis: pc.IsVisible
});
return Json( categories );
为什么不简单地选择一个具有适当名称的匿名对象呢?或者,如果您在许多地方都这样做,则使用一个具有短名称的视图特定类作为结果。然后序列化匿名对象(或视图类),而不是您的业务实体
var categories = primaryCategories.Select( pc => new
{
id : pc.Id,
n : pc.Name,
img: pc.Image,
sc : pc.SubCategories,
vis: pc.IsVisible
});
return Json( categories );
这是一个很好的解决方案,当然比添加一组额外的属性要好,我更喜欢注释数据结构(使用属性)是保持代码干燥,随着web服务的发展,变量名之间的手动映射将不太容易维护,因为两个字段将需要更新。这是一个很好的解决方案,当然,与添加一组额外的属性相比,我更喜欢对数据结构(带有属性)进行注释,这是为了保持代码干燥。随着web服务的不断发展,两个字段需要更新,变量名之间的手动映射将变得不易维护。