[英]Type 'System.String' is not supported for deserialization of an array
[英]"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”的網絡方法簽名。
是的,方法簽名是問題所在。 您在添加admins
和depts
之前擁有的 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.