簡體   English   中英

使用 JSON.stringify 的“類型 System.String 不支持反序列化數組”錯誤

[英]"Type System.String is not supported for deserialization of an array" error using JSON.stringify

為了響應按鈕單擊,我收集了一些用戶提供的數據並將其傳遞給 Web 方法進行處理。

當此映射具有簡單變量時,它工作正常(int、string 等)但現在我添加了兩個對象數組並遇到了問題。 我得到“消息:類型 System.String 不支持數組的反序列化”。 我在 C# Web 應用程序 (VS 2017) 中使用 JSON.Net。

這是我到目前為止:

var admins = [];
var departments = [];

在某些時候,這些數組將包含一組對象,例如部門名稱、首字母縮略詞的行,或者在“管理員”的情況下將包含用戶 ID、姓氏等行。

$(document).on("click", "#btnAdd", function (event) {
    ...
    var newMapping = {
        orgName: orgName,
        orgAcronym: acronym,
        admins: admins,
        depts: departments
    }
    addNewOrg(newMapping, "oMapping");
    ...
});

function addNewOrg(newMapping, jsonObjName) {
    $.ajax({
        url: "../WebService/Blah.asmx/AddOrganization",
        type: "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        data: "{" + jsonObjName + ":" + JSON.stringify(newMapping) + "}",  // This is where it throws up!
    }).done(function (result) {
        if (!result || result.d === "") {
        }
        else {
            var jResult = result.d;
            if (jResult == "-1") {
            }
            else {
            }
        }
    }).fail(function (jqXHR, textStatus, errorThrown) {
    });  
    return false;
}

網絡方法:

[WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]

public string AddOrganization(Dictionary<string, string> oMapping)
{
    string JSONresult = string.Empty;
    var ErrorData = new object();

    if (oMapping.Count == 0)
        return JSONresult;

    Organization oOrg = new Organization();
    try
    {
        oOrg.OrganizationName = oMapping["orgName"].ToString();
        oOrg.Acronym = oMapping["orgAcronym"].ToString();

        //JSONresult = AddOrganization(oOrg);
    }
    catch (Exception ex)
    {
        ErrorData = new
        {
            Success = "false",
            Error = "Internal error: " + ex.Message
        };
        JSONresult = JsonConvert.SerializeObject(ErrorData);
    }
    return JSONresult;
}

更新:

當我使用“調試器”跟蹤代碼並在“addNewOrg”函數中放置一個斷點時,我可以看到“newMapping”包含:

orgName="Organization1"
orgAcronym="ORG1"
admins = [[object Object], [object Object]]  // I added two users
depts = [[object Object], [object Object]]   // I added two departments

然后,當我檢查 JSON.stringify(newMapping) 它包含:

"{\"orgName\":\"ORGANIZATION1\",\"orgAcronym\":\"ORG1\",\"admins\":[{\"fn\":\"John\",\"mi\":\"\",\"ln\":\"Doe\",\"email\":\"John.Doe@blah.com\",\"userid\":\"ABCDE\",\"userType\":4},{\"fn\":\"Jane\",\"mi\":\"\",\"ln\":\"Doe\",\"email\":\"Jane.Doe@blah.com\",\"userid\":\"FGHIJ\",\"userType\":4}],\"depts\":[{\"dn\":\"Department1\",\"ac\":\"DPT1\"},{\"dn\":\"Department2\",\"ac\":\"DPT2\"}]}"

所以,對我來說,它看起來不像 JSON.Stringify 是罪魁禍首。 但它跳過“完成”並進入“失敗”。 我認為這可能是“Dictionary<string, string> oMapping”的網絡方法簽名。

是的,方法簽名是問題所在。 您在添加adminsdepts之前擁有的 JSON 是一個簡單的對象,其中所有值都是字符串。 既然其中兩個值是數組,就不能再將其反序列化為Dictionary<string, string>了。 您可以嘗試將其更改為Dictionary<string, object> ,但實際上更好的解決方案是在 C# 中創建數據傳輸對象 (DTO) 類以適合您發送的數據。 您的 DTO 的屬性名稱需要與您發送的 JSON 中的屬性名稱相匹配。 類名可以是任何你想要的。

根據您的示例 JSON,這樣的事情應該可以工作:

public class OrgDTO
{
    public string orgName { get; set; }
    public string orgAcronym { get; set; }
    public List<AdminDTO> admins { get; set; }
    public List<DeptDTO> depts { get; set; }
}

public class AdminDTO
{
    public string fn { get; set;}
    public string mi { get; set; }
    public string ln { get; set; }
    public string email { get; set; }
    public string userid { get; set; }
    public int userType { get; set; }
}

public class DeptDTO
{
    public string dn { get; set; }
    public string ac { get; set; }
}

然后更改您的方法簽名以接受“根”DTO,在本例中為OrgDTO

public string AddOrganization(OrgDTO orgDto)
{
    ...
}

顯然,您還需要調整方法內的代碼,因為您將不再使用Dictionary<string, string>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM