You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将JSON字符串转为POST参数时遇InvalidCastException异常求助

解决JSON转POST请求参数时的InvalidCastException异常

异常原因

你遇到的System.InvalidCastException是因为:

  • ExpandoObject转成的IDictionary<string, object>中,值的类型不都是string(比如legs是嵌套对象数组),直接强制转换为IEnumerable<KeyValuePair<string, string>>类型不匹配,导致转换失败。

正确实现方式

方式一:转成x-www-form-urlencoded表单格式

如果后端要求接收表单格式参数,需要将复杂类型(数组、对象)序列化为JSON字符串后再构建表单内容:

var s = @"
{
  ""time-in-force"": ""Day"",
  ""order-type"": ""Limit"",
  ""price"": ""2.0"",
  ""price-effect"": ""Credit"",
  ""legs"": [
     {
     ""instrument-type"": ""Equity Option"",
      ""symbol"": ""SPY   191018C00298000"",
      ""quantity"": 1,
      ""action"": ""Buy to Open""
     },
     {
     ""instrument-type"": ""Equity Option"",
      ""symbol"": ""SPY   191018C00295000"",
      ""quantity"": 1,
      ""action"": ""Sell to Open""
    }
  ]
}
";

try
{
    dynamic json = JsonConvert.DeserializeObject<ExpandoObject>(s, new ExpandoObjectConverter());
    var props = json as IDictionary<string, object>;
    
    var formData = new List<KeyValuePair<string, string>>();
    foreach (var kvp in props)
    {
        if (kvp.Value is string strVal)
        {
            formData.Add(new KeyValuePair<string, string>(kvp.Key, strVal));
        }
        else
        {
            // 将复杂类型序列化为JSON字符串
            var jsonVal = JsonConvert.SerializeObject(kvp.Value);
            formData.Add(new KeyValuePair<string, string>(kvp.Key, jsonVal));
        }
    }
    
    var furl = new FormUrlEncodedContent(formData);
    // 后续发送POST请求
}
catch (Exception ex)
{
    // 异常处理逻辑
}

方式二:直接发送JSON格式请求体

如果后端支持接收application/json格式的请求体,无需转换为表单,直接用原始JSON字符串构建请求内容更高效:

var s = @"
{
  ""time-in-force"": ""Day"",
  ""order-type"": ""Limit"",
  ""price"": ""2.0"",
  ""price-effect"": ""Credit"",
  ""legs"": [
     {
     ""instrument-type"": ""Equity Option"",
      ""symbol"": ""SPY   191018C00298000"",
      ""quantity"": 1,
      ""action"": ""Buy to Open""
     },
     {
     ""instrument-type"": ""Equity Option"",
      ""symbol"": ""SPY   191018C00295000"",
      ""quantity"": 1,
      ""action"": ""Sell to Open""
    }
  ]
}
";

try
{
    var jsonContent = new StringContent(s, System.Text.Encoding.UTF8, "application/json");
    // 发送POST请求
}
catch (Exception ex)
{
    // 异常处理逻辑
}

场景选择

  • 若后端要求x-www-form-urlencoded格式,使用方式一;
  • 若后端支持application/json格式,优先使用方式二,避免不必要的类型转换。

内容的提问来源于stack exchange,提问作者Ivan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:36:19