如何让HttpClient Json序列化程序忽略空值

Jam*_*ndy 8 .net c# json

我目前正在使用一个控制台应用程序,我正在使用HttpClient与Apache CouchDB数据库进行交互.我正在使用这篇文章:http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

当我通过PostAsJsonSync序列化并将文档发送到我的数据库时,我想忽略我的类中的null属性,但我不确定如何:

public static HttpResponseMessage InsertDocument(object doc, string name, string db)
    {
      HttpResponseMessage result;
      if (String.IsNullOrWhiteSpace(name)) result = clientSetup().PostAsJsonAsync(db, doc).Result;
      else result = clientSetup().PutAsJsonAsync(db + String.Format("/{0}", name), doc).Result;
      return result;
    }

    static HttpClient clientSetup()
    {
      HttpClientHandler handler = new HttpClientHandler();
      handler.Credentials = new NetworkCredential("**************", "**************");
      HttpClient client = new HttpClient(handler);
      client.BaseAddress = new Uri("*********************");
      //needed as otherwise returns plain text
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      return client;
    }
Run Code Online (Sandbox Code Playgroud)

这是我正在序列化的课程....

class TestDocument
  {
    public string Schema { get; set; }
    public long Timestamp { get; set; }
    public int Count { get; set; }
    public string _rev { get; set; }
    public string _id { get; set; } - would like this to be ignored if null
  }
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

Jul*_*obs 13

假设您使用Json.NET来序列化对象,您应该使用JsonProperty属性的NullValueHandling属性

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
Run Code Online (Sandbox Code Playgroud)

查看这篇精彩文章在线帮助以获取更多详细信息


Hel*_*ick 11

如果您需要此行为你要发送的(这正是导致我对这个问题的情况下)的类的所有属性,我认为这将是清洁:

using ( HttpClient http = new HttpClient() )
{
    var formatter = new JsonMediaTypeFormatter();
    formatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;

    TestDocument value = new TestDocument();
    HttpContent content = new ObjectContent<TestDocument>( value, formatter );
    await http.PutAsync( url, content );
}
Run Code Online (Sandbox Code Playgroud)

这样就不需要为类添加属性了,您仍然不必手动序列化所有值.


小智 6

使用 HttpClient.PostAsync

JsonMediaTypeFormatter jsonFormat = new JsonMediaTypeFormatter();
jsonFormat.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Ignore;
jsonFormat.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;

HttpResponseMessage res = c.PostAsync<T>(url, TObj, jsonFormat).Result;
Run Code Online (Sandbox Code Playgroud)