[英]Deserialize JSON object into C#
在客户端的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
字段的Year / Month / Day都等于0。我该怎么做才能使DateOfBirth
字段正确地反序列化? -在这种情况下,年份= 1980,月份= 5,日期= 19。
使用有角$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代码不在razor视图中,而是在外部js文件中,则应将相对网址构建到应用程序根目录,并将其传递给javascript代码,如本博文所述。
另外,您应该考虑在DTO中为日期时间使用DateTime
类型,而不是构建自己的自定义类。
public class Person
{
public DateTime DateOfBirth { get; set; }
public string Name { get; set; }
}
和角度/ 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!!
});
更改代码的这一部分。
$.post(requestUri, {person:req}, function (data) {
// yeas !! this person is saved!!
});
在您的JavaScript中,删除MyDate类,并在Person类中将dateOfBirth作为字符串。
像这样更改您的人员等级;
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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.