2013-03-02 74 views
7

我目前正在使用一個控制檯應用程序,我正在使用HttpClient與Apache CouchDB數據庫進行交互。我用這篇文章:http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client如何讓HttpClient Json序列化程序忽略空值

我想,當我序列化和通過PostAsJsonSync將文檔發送到我的數據庫忽略班裏空的屬性,但我不知道如何:

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

這裏是我序列化類....

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 
    } 

任何幫助非常讚賞。

+0

在幕後,你很可能使用Json.NET。 http://stackoverflow.com/questions/9819640/json-net-ignoring-null-fields – 2013-03-02 20:39:51

+0

任何想法如何引用它使用的序列化呢? – 2013-03-02 20:44:40

+0

看起來完全像我的問題,當把文檔放到CouchDB中時 – Thomas 2018-01-15 12:55:29

回答

11

假設你正在使用Json.NET序列化你的對象,你應該使用JsonProperty的NullValueHandling財產屬性

[JsonProperty(NullValueHandling=NullValueHandling.Ignore)] 

檢查出這個偉大articleonline help更多細節

+0

儘管它會完全忽略它,即使它後來不再爲空 – 2013-03-02 21:30:40

+0

Right ...相應地更改了答案,因爲JsonIgnore確實不會序列化屬性 – 2013-03-02 21:43:14

+0

這看起來很有前途但由於某些原因,它仍然不會忽略空值,即使它應該! – 2013-03-02 21:46:30

3

我我不確定你可以用PutAsJsonAsync這樣做,因爲你現在擁有它。 Json.NET可以做到這一點,如果你能夠使用它,並且NuGet包存在,如果它有幫助。如果你可以使用它,我已經重寫了InsertDocument功能看起來像:

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」))。 – 2013-03-02 21:46:52

+0

我用它來得到它的工作,但(正如我上面提到的),它仍然忽略了這兩種方法和發送空變量 – 2013-03-02 21:47:31

+0

這工作,但不幸的是,我將把上述標記爲正確的答案,因爲它涉及最少更改我的代碼。 – 2013-03-02 22:00:00

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

這樣就沒有必要將屬性添加到您的類,並且還沒有手動序列化所有的值。

3

使用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; 
相關問題