首页 > 解决方案 > MVC/WebApi:“Newtonsoft.Json.JsonSerializationException”类型的异常 - 从发布请求中检索数组时

问题描述

我正在学习如何在 POST 中发送两个参数,这些参数分组在一个对象数组中作为有效负载。

AngularJS:

var parData = { 'panelists': JSON.stringify($scope.arr), 'id': $scope.webId };
                
$http.post("/api/addPanelists", parData)
    .then(function (data, status, headers, config) {
}), function (data, status, headers, config) {
    alert("An error occurred during the request");
};

服务器端:

班级小组成员:

public class Panelists
{
    public string name { get; set; }
    public string email { get; set; }
}

AddPanelists ApiController:

    [HttpPost]
    public void CreatePanelists(Newtonsoft.Json.Linq.JObject data)
    {
       
        List<Panelists_DataImport.Panelist> panelistList = new List<Panelists_DI.Panelist>();
        panelistList = data["panelist"].ToObject<List<Panelists_DataImport.Panelist>>();
        webID = data["webId"].ToObject<Panelists_DataImport.Webinar>();

    }

数据内容:

{{  "panelists": "[{\"name\":\"Jack Anderson\",\"email\":\"janderson@email.com\"},{\"name\":\"Ed Johnson\",\"email\":\"ejohnson@email.com\"},{\"name\":\"Dead Poole\",\"email\":\"dpoole@email.com\"},{\"name\":\"Hank  Schmidt\",\"email\":\"hschmidt@email.com\"},{\"name\":\"Steven Alves\",\"email\":\"salves@email.com\"}]",  "id": "94395753143"}}

当我到达线路时

panelistList = data["panelists"].ToObject<List<Panelists>>();          

我收到此错误:

Error converting value "[{"name":"Jack Anderson","email":"janderson@email.com"},{"name":"Ed Johnson","email":"ejohnson@email.com"},{"name":"Dead Poole","email":"dpoole@email.com"},{"name":"Hank  Schmidt","email":"hschmidt@email.com"},{"name":"Steven Alves","email":"salves@email.com"}]" to type 'System.Collections.Generic.List`1[Panelists_DataImport.Panelists]'. Path ''.

如何从发布请求中正确检索数组?我使用了不正确的类型吗?

我现在被困住了,任何帮助都将不胜感激。

谢谢你,伊拉斯莫

更新代码 (不工作还不了解如何从文章中实现)

    [HttpPost]
    public void CreatePanelists(Newtonsoft.Json.Linq.JObject data)
    {

        string webID = data["id"].ToString();

        IList<Panelist> panelistList = new IList<Panelist>;
    }

    public class Panelist
    {
        public string name { get; set; }
        public string email { get; set; }
    }

    public class Parameters
    {
        public IList<Panelist> panelists { get; set; }
        public string id { get; set; }
    }

更新新代码和错误窗口的屏幕截图:

代码

错误

标签: c#arraysasp.net-web-api

解决方案


你在这里做错了什么。

有效的 JSON 将是

{
    "panelists": [{
        "name": "Jack Anderson",
        "email": "janderson@email.com"
    }, {
        "name": "Ed Johnson",
        "email": "ejohnson@email.com"
    }, {
        "name": "Dead Poole",
        "email": "dpoole@email.com"
    }, {
        "name": "Hank  Schmidt",
        "email": "hschmidt@email.com"
    }, {
        "name": "Steven Alves",
        "email": "salves@email.com"
    }],
    "id": "94395753143"
}

和类应该是这样的。

public class Panelist
{
    public string name { get; set; }
    public string email { get; set; }
}

public class Example
{
    public IList<Panelist> panelists { get; set; }
    public string id { get; set; }
}

你应该像这样访问它。

data.panelists不像这样data["panelists"]

更新:

[HttpPost]
public void CreatePanelists(string data)
{

    Parameters parameters = JsonConvert.DeserializeObject<Parameters>(data);

    IList<Panelist> panelistList = parameters.panelists;
}

推荐阅读