0

我正在使用JsonResult作为大型 MVC2 应用程序的一部分创建少量 JSON“Web 服务” ,Web 服务将由 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 用于我自己的类)为 MVC2 使用支持此类属性的替代 JavaScript 序列化程序,但是:

  1. 我不知道从哪里开始注入备用 JavaScriptSerializer 供 MVC 使用
  2. 我可以以某种方式扩展现有的 JavaScriptSerializer 类吗,它似乎没有对扩展开放,也没有实现接口或从任何东西(对象除外)继承。

任何帮助、意见和建议表示赞赏。

4

1 回答 1

3

为什么不简单地选择具有适当名称的匿名对象呢?或者,如果您在许多地方都这样做,请使用具有短名称的特定于视图的类作为结果。然后序列化匿名对象(或视图类)而不是您的业务实体。

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

return Json( categories );
于 2010-12-24T12:07:14.677 回答