2013-03-02 12 views
7

Attualmente sto lavorando con un'app console che sto utilizzando HttpClient per interagire con un database Apache CouchDB. Sto usando questo articolo: http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-clientCome ottenere il serializzatore HttpClient Json per ignorare i valori nulli

vorrei ignorare le proprietà nulli nella mia classe quando sto serializzazione e l'invio di un documento alla mia base di dati tramite il PostAsJsonSync ma non sono sicuro di come:

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

Ecco la classe che sto serializzazione ....

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 
    } 

Qualsiasi aiuto molto apprezzato.

+0

Dietro le quinte, si sono probabilmente usando Json.NET. http://stackoverflow.com/questions/9819640/json-net-ignoring-null-fields –

+0

Qualche idea su come fare riferimento al serializzatore che sta usando allora? –

+0

Sembra esattamente come il mio problema quando si fa mettere i documenti a CouchDB – Thomas

risposta

11

Supponendo che si sta utilizzando Json.NET per serializzare l'oggetto, è necessario utilizzare la proprietà NullValueHandling del JsonProperty attribuire

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 

controlla questo article e la online help per maggiori dettagli

+0

questo lo ignorerà completamente anche se, in seguito, non sarà più nullo –

+0

Destra ... cambiò la risposta di conseguenza come JsonIgnore è davvero non serializzare una proprietà –

+0

Questo sembra promettente ma per qualche motivo non sta ancora ignorando i valori nulli, anche se dovrebbe! –

3

I Non sono sicuro che tu possa farlo con lo PutAsJsonAsync come lo hai adesso. Json.NET può farlo, se sei in grado di usarlo, e un pacchetto NuGet esiste se aiuta. Se è possibile utilizzarlo, mi piacerebbe riscrivere la funzione InsertDocument a guardare come:

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")). Risultato; –

+0

L'ho usato per farlo funzionare ma (come ho detto sopra) lo ignora ancora per entrambi i metodi e inviando le variabili nulle –

+0

Questo funziona ma sfortunatamente ho intenzione di contrassegnare quanto sopra come la risposta giusta in quanto comporta il minimo cambia al mio codice. –

11

Se avete bisogno di questo comportamento per tutte le proprietà di tutte le classi che si vuole trasmettere (che è esattamente il caso che mi ha portato a questa domanda), credo che questo sarebbe stato più pulito:

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

in questo modo non c'è bisogno di aggiungere attributi alle classi, e ancora non hanno per serializzare tutti i valori manualmente.

3

uso 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; 
Problemi correlati