2013-02-18 24 views
3

我想在C#環境中使用Nancy FX創建REST服務。我可以很容易地做一個Response.AsJson,它看起來很好。但我希望響應可以省略任何空值的屬性。在Nancy FX中忽略JSON響應中的空值

我還沒有弄清楚如何做到這一點呢。

有人能指向我的某個幫助文檔或博客文章,解釋如何做到這一點。

感謝, JP

回答

3

我會創造一個充滿活力的匿名類型並返回。因此,讓我們假設你有一個User對象是這樣的:

public class User 
{ 
    public string Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

你要傳回這種類型的JSON響應的實例,所以你將有一些像這樣的代碼:

Get["/user/{userid}"] = parameters => 
{ 
    var user = UserService.GetById(Db, (string)parameters.userid); 
    if (user == null) return HttpStatusCode.UnprocessableEntity; 

    return Response.AsJson(user); 
}; 

但你不想返回User實例,而是希望返回一個dynamic類型的單獨實例,該實例只會在給定實例的屬性值不是null的情況下實現屬性。

所以我建議代碼是這樣的:

Get["/user/{userid}"] = parameters => 
    { 
     var user = UserService.GetById(Db, (string)parameters.userid); 
     if (user == null) return HttpStatusCode.UnprocessableEntity; 

     dynamic userDTO = new ExpandoObject(); 
     userDTO.Id = user.Id; 
     if (!string.IsNullOrEmpty(user.FirstName)) userDTO.FirstName = user.FirstName; 
     if (!string.IsNullOrEmpty(user.LastName)) userDTO.Lastname = user.LastName; 

     return Response.AsJson((ExpandoObject)userDTO); 
    }; 

注1 你並不需要測試的Id,因爲這是由User實例從數據庫中成功返回暗示。

注2 你需要使用一個dynamic類型,因此您可以包括特設性能。問題是擴展方法不能接受動態類型。爲了避免這種情況,您需要將其聲明爲ExpandoObject,但將其用作動態。這個技巧會產生一個處理開銷,但它允許您在將動態傳遞給AsJson()擴展方法時將動態轉換爲ExpandoObject