将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
相关产品推荐
相关产品推荐

