为 HttpClient Post 方法准备 Json 对象
Posted
技术标签:
【中文标题】为 HttpClient Post 方法准备 Json 对象【英文标题】:preparing Json Object for HttpClient Post method 【发布时间】:2017-08-31 13:16:05 【问题描述】:我正在尝试为 Post 方法准备 JSON 有效负载。服务器失败无法解析我的数据。我的值上的ToString()
方法无法正确将其转换为 JSON,您能否建议一种正确的方法。
var values = new Dictionary<string, string>
"type", "a"
,
"card", "2"
;
var data = new StringContent(values.ToSttring(), Encoding.UTF8, "application/json");
HttpClient client = new HttpClient();
var response = client.PostAsync(myUrl, data).Result;
using (HttpContent content = response.content)
result = response.content.ReadAsStringAsync().Result;
【问题讨论】:
你看过values.ToString()
生成的东西吗?
查看JsonConvert
类。
服务器调用的签名是什么样的?
@fran 是一个远程 api,还没来得及看,它是一个只接受 Json 的支付网关
【参考方案1】:
您需要先使用JsonConvert.SerializeObject
手动序列化对象
var values = new Dictionary<string, string>
"type", "a", "card", "2"
;
var json = JsonConvert.SerializeObject(values);
var data = new StringContent(json, Encoding.UTF8, "application/json");
//...code removed for brevity
或者根据您的平台,在HttpClient
上使用PostAsJsonAsync
扩展方法。
var values = new Dictionary<string, string>
"type", "a", "card", "2"
;
var client = new HttpClient();
using(var response = client.PostAsJsonAsync(myUrl, values).Result)
result = response.Content.ReadAsStringAsync().Result;
【讨论】:
值得指出的是,这两者都需要第三方库 Json.Net(后者是该库提供的扩展方法)。截至发稿,Json.Net 的下载地址为:newtonsoft.com/json @nkosi,只是出于好奇,哪些平台允许使用 PostAsJsonAsync? @MiguelMateo 看看 API 文档docs.microsoft.com/en-us/previous-versions/aspnet/…【参考方案2】:https://www.newtonsoft.com/json 使用这个。 已经有很多类似的话题了。 Send JSON via POST in C# and Receive the JSON returned?
【讨论】:
谢谢,不能使用任何其他库。将尝试按照@Nkosi 的建议手动或通过 PostAsJsonAsync 方法进行序列化。 @RkRBairi 我建议的两个选项都使用 Json.Net。【参考方案3】:values.ToString()
不会创建有效的 JSON 格式字符串。
我建议您使用 JSON 解析器,例如 Json.Net
或 LitJson
将您的 Dictionary 转换为有效的 json 字符串。这些库能够使用反射将通用对象转换为有效的 JSON 字符串,并且比手动序列化为 JSON 格式更快(尽管如果需要也可以这样做)。
请在此处查看 JSON 字符串格式定义(如果您希望手动序列化对象),以及底部的第 3 方库列表:http://www.json.org/
【讨论】:
以上是关于为 HttpClient Post 方法准备 Json 对象的主要内容,如果未能解决你的问题,请参考以下文章
Android 项目使用 httpclient --> http.client (apache), post/get 方法