如何正确使用javascript反序列化将json字符串转换为复杂对象?

我有我的.ashx处理程序中可用的以下json对象(var items =):

{"Coverages":{"PersonID":10,"DetCode":"","Reimbursement":"","Deductible":"","MaximumPerAnnum":"","MaximumPerVisit":"","MaximumPerVisits":"","SvcCode":""},"CoverageCombinedMaximums":{"PersonID":10,"DetCode":["AAAAA","BBBBB","CCCCC"],"MaximumPerAnnum":""}} public void ProcessRequest (HttpContext context) { bool isSuccessful = true; var items = context.Request.Params["items"]; if (isSuccessful) { JavaScriptSerializer ser = new JavaScriptSerializer(); AdditionalCoveragesPackage package = ser.Deserialize(items); } else { SendErrorMessage(context); return; } } 

这是我试图反序列化的类的结构:

 public class AdditionalCoverage { public int PersonID { get; set; } public string DetCode { get; set; } public decimal? Reimbursement { get; set; } public decimal? Deductible { get; set; } public decimal? MaximumPerAnnum { get; set; } public decimal? MaximumPerVisit { get; set; } public int? MaximumPerVisits { get; set; } public string SvcCode { get; set; } public AdditionalCoverage() { } } public class AdditionalCoverageCombinedMaximum { public int PersonID { get; set; } public string SvcCode { get; set; } public decimal? MaximumPerAnnum { get; set; } public List DetCode { get; set; } public AdditionalCoverageCombinedMaximum() { } } public class AdditionalCoveragesPackage { public List Coverages { get; set; } public List CoverageCombinedMaximums { get; set; } public AdditionalCoveragesPackage() { } public AdditionalCoveragesPackage(AdditionalCoverage coverage, AdditionalCoverageCombinedMaximum maximum) { List coverages = new List(); coverages.Add(coverage); Coverages = coverages; List maximums = new List(); maximums.Add(maximum); CoverageCombinedMaximums = maximums; } public AdditionalCoveragesPackage(List coverages, List maximums) { Coverages = coverages; CoverageCombinedMaximums = maximums; } } 

编辑:以下是我需要更正的客户端方法:

 function saveCoverageDetails() { var handler = "HttpHandlers/UpdateAdditionalCoverageDetailsHandler.ashx"; var coverages = { PersonID: personId, DetCode: "", Reimbursement: "", Deductible: "", MaximumPerAnnum: "", MaximumPerVisit: "", MaximumPerVisits: "", SvcCode: "" }; var maximums = { PersonID: personId, DetCode: ["ACUPUN", "PODIAT", "OSTEOP"], MaximumPerAnnum: "" }; var obj = { Coverages: coverages, CoverageCombinedMaximums: maximums }; var data = ({ items: JSON.stringify(obj) }); callHandler(handler, data, saveSuccessful, failure); } function callHandler(handler, obj, onSuccess, onFail) { $.ajax({ type: "POST", url: handler, data: obj, dataType: "json", success: onSuccess, fail: onFail }); } 

当我使用javascript序列化程序时,它会返回我的AdditionalCoveragesPackage对象 – 但是 – 两个属性:Coverages和CombinedMaximums都是空的。 如何正确反序列化我的json字符串?

在您的JSON字符串中CoveragesCoverageCombinedMaximums是简单对象,而不是数组,因此:

 public class AdditionalCoveragesPackage { public AdditionalCoverage Coverages { get; set; } public AdditionalCoverageCombinedMaximum CoverageCombinedMaximums { get; set; } } 

同样在您的示例JSON中:

 "MaximumPerAnnum":"" 

所以请确保将相应的属性定义为可以为null的小数:

 public decimal? MaximumPerAnnum { get; set; } 

或者解串器会吹。

JSON中的CoveragesCombinedMaximums属性是对象,而不是数组。
您应该将这些更改为数组或更改您的C#类以不使用List

SLAKS和Darin Dimitrov都帮助了很多。 如果我将我的JSON字符串组成如下(我的数组结构不正确并且为我的数字类型传递空字符串而不是零),它结束它是有效的。 这是更正的客户端代码:

  var handler = "HttpHandlers/UpdateAdditionalCoverageDetailsHandler.ashx"; var coverages = [{ PersonID: personId, DetCode: "", Reimbursement: 0, Deductible: 0, MaximumPerAnnum: 0, MaximumPerVisit: 0, MaximumPerVisits: 0, SvcCode: "" }, { PersonID: personId, DetCode: "CHIROP", Reimbursement: 0, Deductible: 0, MaximumPerAnnum: 0, MaximumPerVisit: 0, MaximumPerVisits: 0, SvcCode: ""}]; var maximums = [{ PersonID: personId, DetCode: ["ACUPUN", "PODIAT", "OSTEOP"], MaximumPerAnnum: 0 }, { PersonID: personId, DetCode: ["ACUPUN", "PODIAT", "OSTEOP"], MaximumPerAnnum: 0}]; var obj = { Coverages: coverages, CoverageCombinedMaximums: maximums }; var data = ({ items: JSON.stringify(obj) }); callHandler(handler, data, saveSuccessful, failure);