2015-08-27 68 views
1

我在使用Json.NET將JSON字符串轉換爲C#對象時遇到了問題。Json.NET反序列化自定義對象返回null

我用AJAX調用ashx的

$.ajax({ 
    url: "/Handler/Handler.ashx?WorkType=SaveData", 
    type: "POST", 
    data: JSON.stringify({ 'DataInfo': Info }), 
    //data: "{'DataInfo':" + JSON.stringify(Info) + "}", 
    dataType: "json", 
    success: function (data, textStatus, jqXHR) { 
     if (data.Result) { 

     } 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
     alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')"); 
    } 
}); 

我的JSON字符串就像

{ 
   "DataInfo": [ 
      { 
         "EditType": "Create", 
         "CustCode": "SSG", 
         "KeyNoStr": "rgrg", 
         "Requester": "rgrg", 
         "VerificationCode": "VAVBZ", 
         "Databody": "TESt123", 
         "HasMap": false, 
         "IsColse": false, 
         "HasOrder": false, 
         "IsUrgent": true 
      } 
   ] 
} 

和我.ashx的服務器端的代碼是這樣..

public class DataInfo 
{ 
    public string EditType { get; set; } 
    public string CustCode { get; set; } 
    public string KeyNoStr { get; set; } 
    public string Requester { get; set; } 
    public string VerificationCode { get; set; } 
    public string Databody { get; set; } 
    public string HasMap { get; set; } 
    public string IsColse { get; set; } 
    public string HasOrder { get; set; }    
    public string IsUrgent { get; set; } 
} 

主功能在.ashx中

public void ProcessRequest(HttpContext context) 
{ 
    Request = context.Request; 
    Response = context.Response; 

    string lv_strResult = string.Empty; 

    DataInfo lv_oInfo = JsonConvert.DeserializeObject<DataInfo >((new StreamReader(Request.InputStream)).ReadToEnd()); 
} 

我做錯了什麼?

+0

試着首先獲取字符串響應,看看它是否爲空。 –

回答

2

那是因爲JSON對象是DataInfo數組,所以你需要使用這些類

public class DataInfo 
{ 
    public string EditType { get; set; } 
    public string CustCode { get; set; } 
    public string KeyNoStr { get; set; } 
    public string Requester { get; set; } 
    public string VerificationCode { get; set; } 
    public string Databody { get; set; } 
    public bool HasMap { get; set; } 
    public bool IsColse { get; set; } 
    public bool HasOrder { get; set; } 
    public bool IsUrgent { get; set; } 
} 

public class RootObject 
{ 
    public List<DataInfo> DataInfo { get; set; } 
} 

//your method 
public void ProcessRequest(HttpContext context) 
{ 
    Request = context.Request; 
    Response = context.Response; 

    string lv_strResult = string.Empty; 

    DataInfo lv_oInfo = JsonConvert.DeserializeObject<RootObject>((new StreamReader(Request.InputStream)).ReadToEnd()); 
} 
+0

嗨@Kevin Chang您是否測試瞭解決方案? – JuanK

+0

這對我有用。謝謝@JuanK :) –

0

你的JSON代表結構類型的名爲DataInfo一個屬性List<DataInfo>

所以,你需要反序列化將DataInfo lv_oInfo = JsonConvert.DeserializeObject<DataInfo >((new StreamReader(Request.InputStream)).ReadToEnd());替換爲

var jobject = (JObject)JsonConvert.DeserializeObject((new StreamReader(Request.InputStream)).ReadToEnd()); 
var di_json = jobject["DataInfo"].ToString(); // Dirty but this is the main idea 
var data_infos = JsonConvert.DeserializeObject<List<DataInfo>>(di_json); 

這不是最好的鱈魚由於雙重反序列化,它在世界上是一樣的,但它表明了這個想法。