簡體   English   中英

將JSON對象反序列化為C#

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM