【问题标题】:C# format an array for post to ApiC# 格式化一个数组以发布到 Api
【发布时间】:2020-07-02 23:06:02
【问题描述】:

我正在尝试获取我需要传递给发布请求的 json 数组的正确格式。

我得到的示例代码显示了使用 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 数组,并通过 post 请求传递它们:

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

当我在浏览器中检查 console.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"
}}

我在字符串的开头和结尾看到了额外的大括号。

我的目标是能够传递一个看起来与第 3 方 api 需要格式化的数组完全一样的数组,我认为我做的不正确。

这是我需要的格式,专门用于 panellist 字符串

{
  "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"
    }
  ]
 }

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

谢谢, 伊拉斯莫

更新

我认为多余的大括号已经没有了,但是我怎么知道要传递的字符串是这样的:

{
  "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"
    }
  ]
 }

如果您看到屏幕截图,我不确定它看起来是否正确。可能是我正在查看输出而不了解将传递的实际值。

【问题讨论】:

  • 你是如何在 c# 端检查字符串的?
  • 您是否尝试将操作参数类型更改为Parameterspublic void CreatePanelists(Parameters parameters)
  • @Fabio - 我没有尝试更改那部分。我可以试一试,我认为当我改变参数的类型时,该方法不会从 JavaScript 中调用,但让我试试。
  • @Fabio - 是的,我尝试并更改为 public void CreatePanelists(Parameters data),但是该方法没有得到执行。不知道为什么,但就是这样。
  • 您是否在参数中添加了[FromBody] 属性? Create([FromBody] Parameters data)

标签: c# arrays json string api


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多