1

このjsonを逆シリアル化できるC#クラスを作成する方法を見つけようとしています。誰かが私を正しい方向に向けることができますか?

これが私のjsonです

{
"0": {
    "heading": "Home",
    "link": "#",
    "dropdown": {}
},
"1": {
    "heading": "About",
    "link": "#",
    "dropdown": {
        "0": {
            "name": "Programs",
            "value": "programs"
        },
        "1": {
            "name": "Sample Page",
            "value": "test"
        },
        "2": {
            "name": "Donations",
            "value": "donations"
        }
    }
},
"2": {
    "heading": "Products",
    "link": "#",
    "dropdown": {}
},
"3": {
    "heading": "Contact Us",
    "link": "#",
    "dropdown": {
        "0": {
            "name": "Programs",
            "value": "programs"
        },
        "1": {
            "name": "Donations",
            "value": "donations"
        }
    }
}

}

私は次のことを試しましたが、運がありません

public class Menu
{
    public MenuItem MenuItems { get; set; }
}

public class MenuItem
{
    public string Heading { get; set; }
    public string Link { get; set; }
    public DropDownMenu DropDownMenu { get; set; }
}

public class DropDownMenu
{
    public string Name { get; set; }
    public string Value { get; set; }   
}

私のコントローラーでは、次を使用してjsonをオブジェクトに逆シリアル化しようとしています。

 [HttpPost]
 public ActionResult AddMenu(string menuType, string menu, string menuTitle)
 {
     var serializer = new JavaScriptSerializer();
     var newMenu = serializer.Deserialize<Menu>(menu);
  }

注: menu 変数には JSON 文字列が含まれます。

4

2 に答える 2

1

現在の JSON には 4 つのメニュー項目があります... 5 つまたは 6 つに変わる可能性があると思いますよね?... もしそうなら... JSON が正しくない場合は、配列を使用する必要があります。

何かのようなもの:

[
{
    "heading": "Home",
    "link": "#",
    "dropdown": []
},
{
    "heading": "About",
    "link": "#",
    "dropdown": [
        {
            "name": "Programs",
            "value": "programs"
        },
        {
            "name": "Sample Page",
            "value": "test"
        },
        {
            "name": "Donations",
            "value": "donations"
        }
    ]
},
{
    "heading": "Products",
    "link": "#",
    "dropdown": []
},
{
    "heading": "Contact Us",
    "link": "#",
    "dropdown": [
        {
            "name": "Programs",
            "value": "programs"
        },
        {
            "name": "Donations",
            "value": "donations"
        }
    ]
}
]

次に、クラスを定義します。

public class MenuItem
{
    public string heading
    {
        get;
        set;
    }

    public string link
    {
        get;
        set;
    }

    public DropDownMenu[] dropdown
    {
        get;
        set;
    }
}

public class DropDownMenu
{
    public string Name
    {
        get;
        set;
    }
    public string Value
    {
        get;
        set;
    }
}

次に、JSON を「MenuItem の配列」として逆シリアル化できます。次のようにします。

var ser = new JavaScriptSerializer();
var newMenu = ser.Deserialize<MenuItem[]>(json);

それが役立つことを願って、

ダニエル。

于 2013-03-04T03:49:23.850 に答える
0

ScottGu のブログから:

ASP.NET MVC 3 には、アクション メソッドが JSON でエンコードされたデータを受け取り、それをアクション メソッド パラメーターにモデル バインドできるようにする組み込みの JSON バインディング サポートが含まれています。

パラメータを受け取る代わりにstring、リクエストをオブジェクトに直接バインドしてみてください ( json モデル バインディング):

[HttpPost]
 public ActionResult AddMenu(string menuType, Menu menu, string menuTitle)
 {
   // use menu here, no need to deserialize anything else
  }

また、クライアントがリクエストのコンテンツ タイプを json として送信することを確認します。次に例を示します。

contentType: 'application/json; charset=utf-8',

Phil Haack の例を参照してください

ここここにあと2つあります。

于 2013-03-04T03:41:59.010 に答える