2013-02-18 2 views
3

Я пытаюсь создать службу REST с использованием Nancy FX в среде C#. Я легко могу сделать Response.AsJson, и все это выглядит хорошо. Но я хочу, чтобы ответ опускал любые свойства, которые являются нулевыми.Опустить нулевые значения в json-ответе от Nancy FX

Я еще не смог понять, как это сделать.

Может ли кто-нибудь указать мне на документ справки или сообщение в блоге где-нибудь, что объясняет, как это сделать.

Спасибо, 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, но использовать его как динамический. Этот трюк несет накладные расходы на обработку, но он позволяет вам придать динамику ExpandoObject при передаче его в метод расширения AsJson().