C# POST调用API如何构造带自定义key的metadata键值对数组
C# 构造API要求的metadata键值对数组传参方案
问题说明
此前向API发送POST请求时,使用字符串数组作为metadata传参,原有代码如下:
string[] metaArray = new string[1]; metaArray[0] = "userID buyer: " + CachedUserOurself.userID; var postModel = new { merchant_uid = merchant_uid_toreceiveMoney, products = products, metadata = parameters, // 其余字段省略 };
该写法当前可正常运行,但后续将不再兼容:API会自动将字符串数组的下标作为key值解析,例如传入:
"metadata": [ "userID buyer: 1419" ],
会被自动转换为以下结构,其中自动生成的"key": "0"即将触发接口报错:
"metadata": [ { "key": "0", "value": "userID buyer: 1419" } ],
需要调整传参格式,最终生成显式指定key、value的结构,目标格式如下:
"metadata": [ { "key": "userID buyer", "value": "1419" } ],
此前尝试使用List<KeyValuePair<string, string>>构造参数,写法如下,但无法被API识别:
var parameters = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("key", "userId buyer"), new KeyValuePair<string, string>("value", CachedUserOurself.userID) };
错误原因
上述KeyValuePair写法的问题在于,列表中包含2个独立的键值对元素,序列化后会生成2个平级的对象,完全不符合API要求的「单个数组元素内同时包含key、value两个属性」的结构。
正确实现方式
直接构造匿名对象数组/列表,让每个数组元素都是同时包含key和value属性的对象,序列化后即可完全匹配接口要求,代码如下:
// 构造符合接口要求的metadata结构 var metadataParams = new List<object> { new { key = "userID buyer", value = CachedUserOurself.userID.ToString() // 若需要新增其他元数据项,直接在列表内追加同结构的匿名对象即可 } }; var postModel = new { merchant_uid = merchant_uid_toreceiveMoney, products = products, metadata = metadataParams, // 其余字段保持原有逻辑不变 };
如果需要传递多个元数据项,直接在列表中新增对应匿名对象即可,示例:
var metadataParams = new List<object> { new { key = "userID buyer", value = CachedUserOurself.userID.ToString() }, new { key = "orderSource", value = "h5Page" } };
该写法序列化后的JSON结构和API要求完全一致,不会再出现自动生成数字下标的报错问题。
内容的提问来源于stack exchange,提问作者innom
相关产品推荐
相关产品推荐

