2013-03-04 86 views
1

我想弄清楚如何创建一个C#类,我可以反序列化这个JSON到。 有人可以指出我正确的方向吗?如何将此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); 
    } 

注意:菜单变量包含JSON字符串。

回答

0

ScottGu's blog

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', 

See Phil Haack's example

Herehere是另外两个。

+0

反序列化不会接受一个对象,它必须如下。 反序列化(字符串); //这是函数签名。 – 2013-03-04 04:09:50

+0

当然,它的工作原理,你介意给我显示其他文档吗?我已经添加了几个示例(包括指向Phil Hacck的博客的链接),显示了json模型绑定。 – Ulises 2013-03-04 15:15:46

+0

增加了一个链接到ScottGu的博客 – Ulises 2013-03-04 15:29:18

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的作为 “的MenuItems的阵列” ......这样的:

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

希望有帮助,

丹尼尔。

+0

这导致了一个异常,说明没有为MenuItem []定义无参数的构造函数。如果我定义它,我仍然会收到异常。 – 2013-03-04 04:06:07

+0

我刚刚在Mvc 4站点(.Net 4.5)中测试过,它工作正常。你可以在这个预览中看到它:http://screencast.com/t/slucdqpK5 – Daniel 2013-03-04 14:09:27