PostAsJsonAsync忽略JsonProperty名称属性问题咨询
HttpClient PostAsJsonAsync 忽略 JsonProperty 属性的原因及修复方案
问题场景
我编写了一个HttpClient的静态扩展方法用于提交数据,代码如下:
public static Task<HttpResponseMessage> PostExAsync<TValue>(this HttpClient client, string path, TValue value, CancellationToken ct = default) { if (value == null) { return client.PostAsync(path, null, ct); } return client.PostAsJsonAsync(path, value, ct); }
使用这个方法时,实体类上的JsonProperty(Name)属性会被忽略。但换成手动用JsonConvert序列化再通过PostAsync提交的版本,就能正常识别该属性:
public static Task<HttpResponseMessage> PostExAsync<TValue>(this HttpClient client, string path, TValue value, CancellationToken ct = default) { var json = value != null ? JsonConvert.SerializeObject(value) : null; var content = value != null ? new StringContent(json, Encoding.UTF8, "application/json") : null; return client.PostAsync(path, content, ct); }
我想知道第一种方法失效的原因,并且更倾向于用第一种方法的实现思路来修复。
失效原因
问题出在序列化器的兼容性差异上:
- 你调用的
HttpClient.PostAsJsonAsync是System.Net.Http.Json命名空间下的方法,它默认使用System.Text.Json作为序列化器。 - 而
JsonProperty(Name)是**Newtonsoft.Json(Json.NET)**库独有的特性,System.Text.Json完全不识别这个特性,所以序列化时会直接忽略它的配置。 - 第二种方法里的
JsonConvert.SerializeObject是Newtonsoft.Json的核心API,能正确读取JsonProperty属性的配置,所以序列化结果符合预期。
修复第一种方法的实现
要让第一种方法的思路生效,只需要让PostAsJsonAsync改用Newtonsoft.Json来序列化即可,有两种常见方式:
方式1:手动构建基于Newtonsoft.Json的HttpContent
保留原方法的结构,内部用Newtonsoft.Json序列化后生成StringContent,逻辑和第二种方法一致,但写法更贴近原思路:
public static Task<HttpResponseMessage> PostExAsync<TValue>(this HttpClient client, string path, TValue value, CancellationToken ct = default) { if (value == null) { return client.PostAsync(path, null, ct); } var json = JsonConvert.SerializeObject(value); var content = new StringContent(json, Encoding.UTF8, "application/json"); return client.PostAsync(path, content, ct); }
方式2:使用Json.NET版本的PostAsJsonAsync
安装Microsoft.AspNet.WebApi.Client NuGet包后,它会提供基于Newtonsoft.Json的PostAsJsonAsync扩展方法(属于System.Net.Http命名空间),直接使用这个版本的方法即可:
public static Task<HttpResponseMessage> PostExAsync<TValue>(this HttpClient client, string path, TValue value, CancellationToken ct = default) { if (value == null) { return client.PostAsync(path, null, ct); } // 此PostAsJsonAsync来自Microsoft.AspNet.WebApi.Client,使用Newtonsoft.Json序列化 return client.PostAsJsonAsync(path, value, ct); }
注意:安装该NuGet包后,要注意命名空间的引用,避免和System.Net.Http.Json下的方法冲突。
内容的提问来源于stack exchange,提问作者Ivan Debono
相关产品推荐
相关产品推荐

