2013-03-02 19 views
7

Aktualnie pracuję z aplikacją konsoli, w której używam HttpClient do interakcji z bazą danych Apache CouchDB. Używam tego artykułu: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-clientJak zdobyć serializator HttpClient Json do zignorowania wartości pustych

Chciałbym ignorować zerowe właściwości w mojej klasie, kiedy jestem szeregowania i wysłaniem dokumentu do mojej bazy danych za pośrednictwem PostAsJsonSync ale nie jestem pewien, jak:

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

Oto klasa ja szeregowania ....

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 
    } 

Każda pomoc mile widziane.

+0

Za kulisami, prawdopodobnie za pomocą Json.NET. http://stackoverflow.com/questions/9819640/json-net-ignoring-null-fields –

+0

Każdy pomysł, jak odwołać się do serializera, którego używa? –

+0

Wygląda dokładnie tak, jak mój problem, gdy robię wkładane dokumenty do CouchDB – Thomas

Odpowiedz

11

Zakładając, że używasz Json.NET do serializacji swój przedmiot, należy użyć właściwości NullValueHandling z JsonProperty przypisują

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 

Sprawdź tę wielką article i online help więcej szczegółów

+0

to zignoruje to całkowicie, nawet jeśli później nie będzie już wartością zerową –

+0

Dobrze ... zmieniło odpowiedź odpowiednio, ponieważ JsonIgnore nie jest serializacją właściwości –

+0

To wygląda obiecująco ale z jakiegoś powodu wciąż nie ignoruje wartości zerowych, nawet jeśli powinno! –

3

I "Nie jestem pewien, czy możesz to zrobić z PutAsJsonAsync, jak to masz teraz. Json.NET może to zrobić, jeśli możesz go użyć, a pakiet NuGet istnieje, jeśli pomaga. Jeżeli możesz go używać, chciałbym przepisać funkcję InsertDocument wyglądać:

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, new StringContent (json, null, "application/json")). –

+0

Użyłem tego, aby to działało, ale (jak wspomniałem powyżej) wciąż ignoruje to dla obu metod i wysyła zmienne zerowe –

+0

To działa, ale niestety zamierzam oznaczyć powyższe jako właściwą odpowiedź, ponieważ obejmuje ona najmniej zmiany w moim kodzie. –

11

jeśli trzeba to zachowanie wszystkich właściwości wszystkich klas masz zamiar wysłać (co jest dokładnie tak, że doprowadziło mnie to pytanie), myślę, że to byłoby czystsze:

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

W ten sposób nie ma potrzeby, aby dodać atrybuty do swoich zajęć, a ty nadal nie trzeba ręcznie serializacji wszystkie wartości.

3

użycie 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; 
Powiązane problemy