James Mundy
James Mundy

Reputation: 4329

How to get HttpClient Json serializer to ignore null values

I'm currently working with a console app which I'm using the HttpClient to interact with an Apache CouchDB database. I'm using this article: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

I'd like to ignore the null properties in my class when I'm serializing and sending a document to my database via the PostAsJsonSync but I'm not sure how:

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;
    }

Here's the class I'm serializing....

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
  }

Any help much appreciated.

Upvotes: 11

Views: 18749

Answers (4)

user3689695
user3689695

Reputation: 71

use 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;

Upvotes: 7

HellBrick
HellBrick

Reputation: 557

If you need this behavior for all the properties of all the classes you're going to send (which is exactly the case that has led me to this question), I think this would be cleaner:

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 );
}

This way there's no need to add attributes to your classes, and you still don't have to serialize all the values manually.

Upvotes: 13

Steven V
Steven V

Reputation: 16585

I'm not sure you can do that with the PutAsJsonAsync as you have it right now. Json.NET can do this though, if you're able to use it, and a NuGet package exists if it helps. If you can use it, I'd rewrite the InsertDocument function to look like:

public static HttpResponseMessage InsertDocument(object doc, string name, string db)
    {
      HttpResponseMessage result;
      string json = JsonConvert.SerializeObject(doc, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
      if (String.IsNullOrWhiteSpace(name)) result = clientSetup().PostAsync(db, new StringContent(json, null, "application/json")).Result;
      else result = clientSetup().PutAsync(db + String.Format("/{0}", name), new StringContent(json, null, "application/json")).Result;
      return result;
    }

Upvotes: 3

Julien Jacobs
Julien Jacobs

Reputation: 2629

Assuming that you are using Json.NET to serialize your object, you should use the NullValueHandling property of the JsonProperty attribute

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]

Check out this great article and the online help for more details

Upvotes: 18

Related Questions