【问题标题】:Posting JSON array to PHP API via RestSharp C#通过 RestSharp C# 将 JSON 数组发布到 PHP API
【发布时间】:2021-10-01 07:02:37
【问题描述】:

我正在使用 C# 制作一个应用程序,需要将 JSON 数组发布到我的 php api 文件中。我有这个代码:

        string JSONString = JsonConvert.SerializeObject(dt);
        var client = new RestClient(ipadress);
        var request = new RestRequest(apiendpoint, Method.POST);
        request.RequestFormat = DataFormat.Json;
        var body = new
        {
            key = apikey,
            items = JSONString               

        };
        request.AddJsonBody(body);
        var response = client.Post(request);
        var content = response.Content; // Raw content as string
        MessageBox.Show(content.ToString());

所以,问题在于items = JSONString 作为字符串而不是数组发送,并且 PHP API 文件没有将其作为数组输入(我无法从行中提取值)。我没有找到任何信息,我怎样才能在 RestSharp 中制作二级数组,比如(它只是虚构的代码,它不起作用:

var body = new
    {
        key = apikey,
        items = { 
           foreach(DataRow row in dt.Rows)
              {
                 aid = row["aid"].ToString(),
                 item= row["item"].ToString(),
                 desc= row["desc"].ToString()
              }
       }               

    };

我的 PHP api 文件(仅供参考,我正在使用框架):

$resultArray = array_map("html_entity_decode", $data);
foreach ($resultArray as $items) {
    $db->insert("test_items", ["aid"=>$items->aid, "item"=>$items->item, "desc"=>$items->desc]);
}
dnd($resultArray['items']);

【问题讨论】:

    标签: c# php arrays json restsharp


    【解决方案1】:

    您可以这样做,C# 很好地支持匿名类型,因此您可以发出任何所需的 POCO 模式:

    在编译时(严格的 API,已知所有属性,无需打开/关闭某些东西)我们这样做:

    var body = new
        {
            key = apikey,
            items = dt
                  .Rows
                  .Cast<DataRow>() 
                  .Select(x=> new
                  {
                     aid = x["aid"].ToString(),
                     item= x["item"].ToString(),
                     desc= x["desc"].ToString()
                  })
                  .ToList()
           }
        };
    

    在运行时(如果您的属性集仅在运行时已知)我们会这样做:

    dynamic body = new ExpandoObject();
    body.key = apiKey;
    body.items = dt
                  .Rows
                  .Cast<DataRow>() 
                  .Select(x=> new
                  {
                     aid = x["aid"].ToString(),
                     item= x["item"].ToString(),
                     desc= x["desc"].ToString()
                  })
                  .ToList();
    

    【讨论】:

    • 感谢您的回答,但它给我带来了错误:datarowcollection does not contain a definition for select。谷歌搜索:) 此代码在 button_click 处执行。它从 dataGridView 获取数据,将 em 推送到 DataTable,我需要将其作为 JSON 发布到我的 PHP API
    • 查看带有 Cast 的更新版本。此外,这里是 msdn 上的 ExpandoObject - docs.microsoft.com/en-us/dotnet/api/… 您只需要包含 System.DynamicSystem.Linq 命名空间。
    • 是的,我想通了。但是代码现在将 NULL 发布到 API .. 将寻找原因 :) 谢谢您的帮助!
    • 我没弄明白,datatable里面填满了数据,但是当我发布到API时,它显示```array(2) { ["key"] => string(29) "XXX -XXX-XXX" ["项目"]=> NULL }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多