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

C# 如何正确使用javascript反序列化将json字符串转换为复杂对象?,c#,ajax,json,ashx,C#,Ajax,Json,Ashx,我的.ashx处理程序(var items=)中提供了以下json对象: 当我使用javascript序列化程序时,它确实返回我的AdditionalCoveragesPackage对象——但是——Coverages和CombinedMaximum这两个属性都是空的。如何使其正确反序列化我的json字符串?json中的coverage和combinedMaximum属性是对象,而不是数组。 您应该将这些更改为数组,或者将C#类更改为不使用JSON字符串中的列表s.覆盖和覆盖组合最大值是简单对象,

我的.ashx处理程序(var items=)中提供了以下json对象:


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

json中的
coverage
combinedMaximum
属性是对象,而不是数组。

您应该将这些更改为数组,或者将C#类更改为不使用JSON字符串中的
列表
s.

覆盖和
覆盖组合最大值
是简单对象,而不是数组,因此:

public class AdditionalCoveragesPackage
{
    public AdditionalCoverage Coverages { get; set; }
    public AdditionalCoverageCombinedMaximum CoverageCombinedMaximums { get; set; }
}
同样在您的示例JSON中:

"MaximumPerAnnum":""
因此,请确保将相应的属性定义为可为空的十进制:

public decimal? MaximumPerAnnum { get; set; }
否则,反序列化程序将崩溃。

并且两者都帮了大忙。如果我按照下面的方式编写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);

感谢您捕获可为空的小数点(投票支持您的答案)。AdditionalCoveragesPackages可以是这两个对象的列表。我的客户端对象的构造似乎是个问题。我发布了这篇文章,看看你是否能从语法上发现我遗漏了什么。结果json字符串被破坏了,因为我使用字符串而不是零来表示可为空的小数。炸鸡脑!!!你让我走上了正确的轨道(所以我投了赞成票)。我的客户端对象的构造似乎是个问题。我把它贴出来是想看看你是否能从语法上发现我遗漏了什么。你遗漏了一个数组(例如,
[1,2,3]
),在哪里?这就是我迷路的地方。当我更改我的客户端脚本时(将覆盖率和最大值{}用[]括起来,-ashx中的我的项目返回null…如果我将覆盖率和最大值更改为:var覆盖率=[{…},{…},{…},[/code>,则需要
var覆盖率=[{PersonID:PersonID,DetCode:,报销:,免赔额:,Maximumperanum:“,MaximumPerVisit:,MaximumPerVisit:,SvcCode:,{PersonID:PersonID,DetCode:,报销:,免赔额:,MaximumPeranum:,MaximumPerVisit:,SvcCode::}];var MaximumPerVisit=[{PersonID:PersonID,DetCode:[“ACUPUN”,“PODIAT”,“OSTEOP”],MaximumPeranum:},{PersonID:PersonID,DetCode:[“ACUPUN”,“PODIAT”,“OSTEOP”],Maximumperanum:“}];我的ashx中的项目为空。如果您只传递一个项目,为什么要使用列表?我可以传递多个项目。我正在测试它-即一个项目的列表:)
"MaximumPerAnnum":""
public decimal? MaximumPerAnnum { get; set; }
 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);