2013-03-02 18 views
7

Ich arbeite derzeit mit einer Konsole App, die ich den HttpClient verwenden, um mit einer Apache CouchDB Datenbank zu interagieren. Ich verwende diesen Artikel: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-clientWie bekomme ich HttpClient Json Serializer um Nullwerte zu ignorieren?

Ich mag die Null-Eigenschaften in meiner Klasse ignorieren, wenn ich die Serialisierung und ein Dokument zu meiner Datenbank über die PostAsJsonSync sende, aber ich bin nicht sicher, wie:

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

Hier ist die Klasse ich Serialisierung ....

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 
    } 

Jede Hilfe sehr geschätzt.

+0

Hinter den Kulissen, die Sie verwenden wahrscheinlich Json.NET. http://stackoverflow.com/questions/9819640/json-net-ignoring-null-fields –

+0

Haben Sie eine Idee, wie Sie den Serialisierer referenzieren können? –

+0

Sieht genauso aus wie mein Problem, wenn ich Dokumente auf CouchDB setze – Thomas

Antwort

11

Unter der Annahme, dass Sie Json.NET verwenden, um Ihr Objekt serialisiert werden, sollten Sie die NullValueHandling Eigenschaft des JsonProperty verwenden Attribut

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 

Schauen Sie sich diese große article und die online help für mehr Details

+0

dies wird es jedoch komplett ignorieren, auch wenn es später nicht mehr null ist –

+0

Richtig ... änderte die Antwort entsprechend, da JsonIgnore tatsächlich keine Eigenschaft serialisiert –

+0

Das sieht vielversprechend aus aber aus irgendeinem Grund ignoriert es immer noch nicht die Null-Werte, obwohl es sollte! –

3

I Ich bin mir nicht sicher, ob du das mit dem PutAsJsonAsync so machen kannst, wie du es gerade hast. Json.NET kann dies jedoch tun, wenn Sie es verwenden können, und ein NuGet-Paket existiert, wenn es hilft. Wenn Sie es verwenden können, würde ich die InsertDocument Funktion umschreiben wie folgt aussehen:

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

clientSetup(). PostAsync (db, neuer StringContent (json, null, "application/json")). Ergebnis; –

+0

Ich habe das verwendet, um es zu funktionieren, aber (wie ich oben erwähnt habe) ignoriert es immer noch für beide Methoden und das Senden der Null-Variablen –

+0

Das funktioniert, aber leider werde ich das oben als die richtige Antwort markieren, da es am wenigsten beinhaltet Änderungen an meinem Code. –

11

Wenn Sie dieses Verhalten für alle Eigenschaften aller Klassen sind Sie gehen zu senden (was genau ist der Fall, dass geführt hat, mich auf diese Frage), ich denke, das sauberer sein würde:

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

auf diese Weise gibt es keine Notwendigkeit, Attribute zu Ihren Klassen hinzufügen, und Sie haben noch nicht manuell alle Werte serialisiert.

3

Verwendung 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; 
Verwandte Themen