0

大規模な MVC2 アプリケーションの一部としてJsonResultを使用して少数の JSON "Web サービス" を作成しています。Web サービスは iPhone アプリによって消費されます。アプリの開発者は、モバイル ネットワークで送信されるデータ量を減らすために、キー名を短縮することを提案しています。現在、PrimaryCategories クラスなど、MVC JsonResult で返すいくつかのクラスがあります。

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でマークし、長い名前のプロパティをバッキング ストアとして使用する 2 番目のプロパティ セットを提供することです。

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.
}

これは冗長すぎるようです。最初に考えたのは、JSON キーの名前を指定できる [ScriptIgnore] に似た属性があるのではないかと考えたのですが、MSDN や Reflector で見つけることができないようです。私の 2 番目の好みは、MVC2 がそのような属性をサポートする代替 JavaScript シリアライザーを挿入することです (私は自分のクラスに NInject を使用します)。

  1. MVC が使用する代替 JavaScriptSerializer の注入を開始する場所がわかりません
  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 に答える