Как правильно использовать десериализацию JavaScript для преобразования строки JSON в сложный объект? - PullRequest
3 голосов
/ 25 октября 2011

У меня есть следующий объект 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 иКомбинированные максимумы пусты.Как заставить это правильно десериализовать мою строку json?

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

В вашей строке JSON Coverages и CoverageCombinedMaximums являются простыми объектами, а не массивами, поэтому:

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

Также в вашем примере JSON:

"MaximumPerAnnum":""

, поэтому убедитесь, чтовы определяете соответствующее свойство как десятичное число со значением NULL:

public decimal? MaximumPerAnnum { get; set; }

, иначе десериализатор сработает.

2 голосов
/ 25 октября 2011

Свойства Coverages и CombinedMaximums в вашем JSON являются объектами, а не массивами.
Вы должны изменить их на массивы или изменить класс C #, чтобы не использовать List<T> s.

0 голосов
/ 26 октября 2011

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