Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在返回JsonResult的MVC2控制器中更改JSON键文本_Json_Asp.net Mvc 2_Asp.net 4.0_Javascriptserializer - Fatal编程技术网

在返回JsonResult的MVC2控制器中更改JSON键文本

在返回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; }

我正在创建少量JSON“Web服务”,作为大型MVC2应用程序的一部分,这些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; }
}
是否有一些内置方法可以使用属性标记属性,或者向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),该序列化程序支持这样一个属性,但是:

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

  • 感谢您的帮助、评论和建议。

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

    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服务的不断发展,两个字段需要更新,变量名之间的手动映射将变得不易维护。