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

本文关键字:转换 字符串 复杂 对象 json 何正确 javascript 反序列化 | 更新日期: 2023-09-27 18:12:25

我有以下json对象,可在我的。ashx处理程序(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<AdditionalCoveragesPackage>(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<string> DetCode { get; set; }
    public AdditionalCoverageCombinedMaximum()
    {
    }
}
public class AdditionalCoveragesPackage
{
    public List<AdditionalCoverage> Coverages { get; set; }
    public List<AdditionalCoverageCombinedMaximum> CoverageCombinedMaximums { get; set; }
    public AdditionalCoveragesPackage()
    {
    }
    public AdditionalCoveragesPackage(AdditionalCoverage coverage, AdditionalCoverageCombinedMaximum maximum)
    {
        List<AdditionalCoverage> coverages = new List<AdditionalCoverage>();
        coverages.Add(coverage);
        Coverages = coverages;
        List<AdditionalCoverageCombinedMaximum> maximums = new List<AdditionalCoverageCombinedMaximum>();
        maximums.Add(maximum);
        CoverageCombinedMaximums = maximums;
    }
    public AdditionalCoveragesPackage(List<AdditionalCoverage> coverages, List<AdditionalCoverageCombinedMaximum> 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字符串?

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

在您的JSON字符串CoveragesCoverageCombinedMaximums是简单的对象,而不是数组,所以:

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

同样在你的示例JSON中:

"MaximumPerAnnum":""

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

public decimal? MaximumPerAnnum { get; set; }

否则反序列化器会爆炸

JSON中的CoveragesCombinedMaximums属性是对象,而不是数组。
你应该将它们更改为数组或更改c#类以不使用List<T>

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);