【问题标题】:How can I deserialize this JSON to a C# object?如何将此 JSON 反序列化为 C# 对象?
【发布时间】:2013-03-04 03:16:04
【问题描述】:

我试图弄清楚如何创建一个可以反序列化这个 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 字符串。

【问题讨论】:

    标签: c# javascript json asp.net-mvc-4


    【解决方案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 反序列化为“菜单项数组”...例如:

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

    希望对你有帮助,

    丹尼尔。

    【讨论】:

    • 这会导致异常,说明没有为 MenuItem[] 定义无参数构造函数。如果我定义它,我仍然会收到异常。
    • 我刚刚在 Mvc 4 站点 (.Net 4.5) 中进行了测试,它工作正常。你可以在这个 screecast 中看到它:screencast.com/t/slucdqpK5
    【解决方案2】:

    来自ScottGu's blog

    ASP.NET MVC 3 包含内置的 JSON 绑定支持,可以启用 接收 JSON 编码数据并将其模型绑定到的操作方法 动作方法参数。

    您可以尝试将请求直接绑定到您的对象(json模型绑定),而不是将参数接收为string

    [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 是另外两个。

    【讨论】:

    • 反序列化不会获取对象,它必须如下。反序列化(字符串); // 这是函数签名。
    • 当然可以,您介意给我看另外说明的文档吗?我添加了更多示例(包括指向 Phil Hackc 博客的链接)显示 json 模型绑定。
    • 添加了一个指向 ScottGu 博客的链接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多