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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:10:25