C#格式化一个数组以发布到Api[英] C# format an array for post to Api

本文是小编为大家收集整理的关于C#格式化一个数组以发布到Api的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我正在尝试获得JSON阵列的正确格式,我需要将其传递给POST请求.

我得到的示例代码在使用C#作为首选编程语言时显示以下格式:

var client = new RestClient("https://api.us/v2/webinars/94395753143/panelists");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/json");
request.AddHeader("authorization", "Bearer _XU6l1eaDs9NQRTcb5QG4m0-ab1F3Y29ikw");
request.AddParameter("application/json", "{\"panelists\":[{\"name\":\"Mary\",\"email\":\"maryjkdfdsgfshdgf@jdfdkjdglfk.jkfgdj\"},{\"name\":\"Mike\",\"email\":\"dfdsgfsdhf@jkgfdgfkdhgfdjg.fkjgdf\"}]}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

作为概念证明,我正在从angularjs视图格式化JSON数组中获取值,并通过邮政请求传递:

$http(request)
    .then(function successCallback(data) {
    
        angular.forEach(data.data, function (item) {
            
            var b = {
                name: item.Name,
                email: item.Email
            };
            $scope.arr.push(b);         
        });

        var parData = JSON.stringify({ 'panelists': $scope.arr, 'id': $scope.webinarId, 'bearer':  $scope.bearer});

    $http.post('/api/AddPanelists', parData)
        .then(function (data) {
    }), function (data) {
        alert("An error occurred during the request");
    };

在我的C#代码中,我有一个接收pardata的函数,并检索传递的3个元素(数组,ID,载体)

    [HttpPost]
    public void CreatePanelists(Newtonsoft.Json.Linq.JObject data)
    {
        Parameters parameters = JsonConvert.DeserializeObject<Parameters>(data.ToString());

        IList<Panelist> panelists = parameters.panelists;  << this value does not seem right
        string webId = parameters.id;      << this value is fine
        string bearer = parameters.bearer; << this value is fine

        var client = new RestSharp.RestClient("https://api.us/v2/webinars/" + webId + "/panelists");
        var request = new RestRequest(Method.POST);
        request.AddHeader("content-type", "application/json;charset=UTF-8");
        request.AddHeader("authorization", "Bearer " + bearer);
        request.AddParameter("application/json", panelists, ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);
        var content = response.Content;

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

        public string bearer { get; set; }
    }

当我在浏览器中检查控制台.log时,查看JavaScript是否格式化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"},{"name":"Nilvio Alexander","email":"nalexanderemail.com"}],"id":94395753143,"bearer":"U19hW2pkQkO2A0Zv5EXz-h4kXJ56s"}

当我检查该值后,它到达事物的c#侧时,字符串看起来有些不同:

当我检查已经通过的内容时,

public void CreatePanelists(Newtonsoft.Json.Linq.JObject data) << here

值外观:

{{
  "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"
    },
    {
      "name": "Nilvio Alexander",
      "email": "nalexander@email.com"
    }
  ],
  "id": 94395753143,
  "bearer": "U19hW2pkQkO2A0Zv5EXz-h4kXJ56s"
}}

我在弦的开头和末端看到了额外的卷曲括号.

我的目标是能够通过看起来完全像第三方API需要格式化的数组,我认为我不正确地进行.

这是我需要具有的格式,专门针对小组成员 string

{
  "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"
    },
    {
      "name": "Nilvio Alexander",
      "email": "nalexander@email.com"
    }
  ]
 }

感谢您阅读我的问题,希望我能得到一些帮助. 如果我需要澄清任何东西,请告诉我.

谢谢, Erasmo

更新

屏幕截图

我认为额外的卷发括号已经消失了,但是我怎么知道要通过的字符串看起来像这样:

{
  "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"
    },
    {
      "name": "Alejandro Nava-Gomez",
      "email": "anava-gomez@cityofmadison.com"
    },
    {
      "name": "itortu",
      "email": "itortu@gmail.com"
    }
  ]
 }

如果您看到屏幕截图,我不确定它看起来正确.我可能是在研究输出,而不了解将通过什么实际值.

推荐答案

您可以创建新对象以满足预期结构.

[HttpPost]
public void CreatePanelists([FromBody] Parameters parameters)
{
    var webId = parameters.id; 
    var bearer = parameters.bearer;
    var data = new
    {
        panelists = parameters.panelists
    };

    var client = 
        new RestSharp.RestClient($"https://api.us/v2/webinars/{webId}/panelists");
    var request = new RestRequest(Method.POST);
    request.AddHeader("content-type", "application/json;charset=UTF-8");
    request.AddHeader("authorization", $"Bearer {bearer}");

    request.AddParameter("application/json", data, ParameterType.RequestBody);

    IRestResponse response = client.Execute(request);
    var content = response.Content;
}

本文地址:https://www.itbaoku.cn/post/1937797.html

问题描述

I am trying to get the correct format for the json array I need to pass to a post request.

The example code I got shows the following format when using c# as the preferred programming language:

var client = new RestClient("https://api.us/v2/webinars/94395753143/panelists");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/json");
request.AddHeader("authorization", "Bearer _XU6l1eaDs9NQRTcb5QG4m0-ab1F3Y29ikw");
request.AddParameter("application/json", "{\"panelists\":[{\"name\":\"Mary\",\"email\":\"maryjkdfdsgfshdgf@jdfdkjdglfk.jkfgdj\"},{\"name\":\"Mike\",\"email\":\"dfdsgfsdhf@jkgfdgfkdhgfdjg.fkjgdf\"}]}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

As proof of concept, I am getting the values from an angularjs view formatting the json array, and passing them through the post request:

$http(request)
    .then(function successCallback(data) {
    
        angular.forEach(data.data, function (item) {
            
            var b = {
                name: item.Name,
                email: item.Email
            };
            $scope.arr.push(b);         
        });

        var parData = JSON.stringify({ 'panelists': $scope.arr, 'id': $scope.webinarId, 'bearer':  $scope.bearer});

    $http.post('/api/AddPanelists', parData)
        .then(function (data) {
    }), function (data) {
        alert("An error occurred during the request");
    };

In my C# code I have a function that receives parDAta and retrieves each of the 3 elements passed (array, id, bearer)

    [HttpPost]
    public void CreatePanelists(Newtonsoft.Json.Linq.JObject data)
    {
        Parameters parameters = JsonConvert.DeserializeObject<Parameters>(data.ToString());

        IList<Panelist> panelists = parameters.panelists;  << this value does not seem right
        string webId = parameters.id;      << this value is fine
        string bearer = parameters.bearer; << this value is fine

        var client = new RestSharp.RestClient("https://api.us/v2/webinars/" + webId + "/panelists");
        var request = new RestRequest(Method.POST);
        request.AddHeader("content-type", "application/json;charset=UTF-8");
        request.AddHeader("authorization", "Bearer " + bearer);
        request.AddParameter("application/json", panelists, ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);
        var content = response.Content;

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

        public string bearer { get; set; }
    }

When I check the console.log in the browser, to see if JavaScript is formatting the json is correct, I see this:

{"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"},{"name":"Nilvio Alexander","email":"nalexanderemail.com"}],"id":94395753143,"bearer":"U19hW2pkQkO2A0Zv5EXz-h4kXJ56s"}

When I check the value once it makes it to the C# side of things, the string looks a bit different:

When I check what has been passed, here:

public void CreatePanelists(Newtonsoft.Json.Linq.JObject data) << here

The value looks:

{{
  "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"
    },
    {
      "name": "Nilvio Alexander",
      "email": "nalexander@email.com"
    }
  ],
  "id": 94395753143,
  "bearer": "U19hW2pkQkO2A0Zv5EXz-h4kXJ56s"
}}

I see extra curly brackets at the beginning and at the end of the string.

My goal is to be able to pass an array that looks exactly as the 3rd party api needs the array to be formatted, I do not think I am doing it correctly.

This is the format I need to have, specifically for the panelist string

{
  "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"
    },
    {
      "name": "Nilvio Alexander",
      "email": "nalexander@email.com"
    }
  ]
 }

Thank you for reading my question, I hope I can get a bit of help. If I need to clarify anything, please just let me know.

Thanks, Erasmo

UPDATE

screen shot

I think the extra curly braces are gone, but how do I know that the string to be passed will look like this:

{
  "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"
    },
    {
      "name": "Alejandro Nava-Gomez",
      "email": "anava-gomez@cityofmadison.com"
    },
    {
      "name": "itortu",
      "email": "itortu@gmail.com"
    }
  ]
 }

If you see the screen shot, I am not sure it looks correct. May be I am looking at the output and not understanding what the actual value will be passed.

推荐答案

You can create new object to satisfy expected structure.

[HttpPost]
public void CreatePanelists([FromBody] Parameters parameters)
{
    var webId = parameters.id; 
    var bearer = parameters.bearer;
    var data = new
    {
        panelists = parameters.panelists
    };

    var client = 
        new RestSharp.RestClient($"https://api.us/v2/webinars/{webId}/panelists");
    var request = new RestRequest(Method.POST);
    request.AddHeader("content-type", "application/json;charset=UTF-8");
    request.AddHeader("authorization", $"Bearer {bearer}");

    request.AddParameter("application/json", data, ParameterType.RequestBody);

    IRestResponse response = client.Execute(request);
    var content = response.Content;
}