将JSON对象反序列化为C#

时间:2016-01-09 00:36:53

标签: c# json asp.net-mvc

在我的ASP.NET MVC 5 webapp中,在客户端,我有两个JavaScript构造函数

MyDate = function (y, m, d) {
    this.year = y;
    this.month = m;
    this.day = d;
}

Person = function (dateOfBirth, name) {
    this.dateOfBirth = dateOfBirth;
    this.name = name;
}

在Razor视图中,我有以下函数构造一个Person对象并将其发布到Action方法

saveThisPerson = function () {

    var dob = new MyDate(1980, 5, 19);

    var p = new Person(dob, 'Mike');

    var requestUri = "/MyProfile/SaveThisPerson";
    var req = JSON.stringify(p);

    $http.post(requestUri, req).success(function (data) {
        // yeas !! this person is saved!!   
    })
}

在C#方面,这是SaveThisPerson方法:

[HttpPost]
public JsonResult SaveThisPerson(Person person)
{
    // omitted
}

这些是需要的两个C#类

public class Person
{
    public MyDate DateOfBirth { get; set; }

    public string Name { get; set; }
}

public class MyDate
{
    public int Year { get; set; }

    public int Month { get; set; }

    public int Day { get; set; }
}

当我运行它时,调用SaveThisPerson操作方法,并将已发布的json反序列化为Person对象,并正确填充名称字段(如“Mike”)。但是DateOfBirth字段的年/月/日都等于0.我需要做什么才能使DateOfBirth字段正确反序列化? - 在本例中为Year = 1980,Month = 5,Day = 19.谢谢

2 个答案:

答案 0 :(得分:1)

使用角度$http服务时,您无需使用JSON.stringify。角度将照顾所有这些。

var dob = new MyDate(1980, 5, 19);
var p = new Person(dob, 'Mike');

var requestUri = "@Url.Action("SaveThisPerson","MyProfile")";   

$http.post(requestUri, p)
    .then(function (data) {
       console.log(data.data);
       // yeas !! this person is saved!!   
    });

上面的代码使用Url.Action辅助方法为SaveThisPerson操作方法构建正确的相对URL。如果您的javascript代码不在剃刀视图中,而是在外部js文件中,则应构建相应的url到app根并将其传递给您的javascript代码,如in this post.所述

此外,您应该考虑在DTO中使用DateTime类型作为日期时间,而不是构建自己的自定义类。

public class Person
{
    public DateTime DateOfBirth { get; set; }    
    public string Name { get; set; }
}

而angular / javascript代码将是

var p = { Name="Scott" , DateOfBirth="12/26/2015" };
var requestUri = "@Url.Action("SaveThisPerson","MyProfile")";   

$http.post(requestUri, p)
    .then(function (data) {
       console.log(data.data);
       // yeas !! this person is saved!!   
    });

答案 1 :(得分:0)

更改此部分代码。

   $.post(requestUri, {person:req}, function (data) {
    // yeas !! this person is saved!!   
   });

在你的javascript中,删除MyDate类并将dateOfBirth作为Person类中的字符串。

像这样更改你的人员课程;

public class Person
{
    public string Name { get; set; }
    public DateTime DateOfBirth { get; set; }
}

如果你真的需要将DateOfBirth作为字符串,并希望以后能够将其转换为DateTime,那么你可以这样做。

DateTime.ParseExact(dateOfBirth, "dd/MM/yyyy", CultureInfo.InvariantCulture);

如果您仍想使用MyDate类,请更改您的控制器。

   [HttpPost]
    public JsonResult PostComplexType(string person)
    {
        var oPerson = JsonConvert.DeserializeObject<Person>(person);
        return Json("success");
    }