根据返回类型接口限制Web API序列化的模型数据字段

时间:2012-11-27 10:52:20

标签: c# mvvm asp.net-web-api json.net

我们正在更新我们的架构,以便为可以在MVVM模式中使用的桌面,Web和移动设备使用单个对象模型。我希望能够通过使用控制器上的接口来限制通过Web API序列化的数据字段。这是必需的,因为移动设备的模型对象存储在HTML5本地存储中,因此不会携带可选数据,而瘦桌面客户端则能够存储(和使用)更多数据。

为了实现这一目标,模型将实现不同的接口,这些接口定义应该序列化哪些数据字段,并且将有一个特定于接口的控制器。

问题是Web API总是序列化模型中的每个字段,即使它不是返回的接口的一部分。我们怎样才能序列化返回接口中的字段?

3 个答案:

答案 0 :(得分:2)

我知道如何自动化特定界面的序列化过程而不是整个对象 我写了里面有这样代码的库(现在这段代码由github gist共享)。它公开了名为ToDynamic的扩展方法。

public static dynamic ToDynamic<T>(this T value, bool deep = true);

使用特定的T提取该T类型中可用的字段 在下面的例子中,T将自动确定 因此,只有IClub成员才会被提取和序列化:

IReadOnlyList<IClub> clubs = retrieving.GetClubs(page, size, criteria);

return this.Request.CreateResponse(HttpStatusCode.OK, clubs.Select(item => item.ToDynamic()));

答案 1 :(得分:1)

我认为您可以使用JsonConverter或使用ContractResolver

执行此操作

创建JsonConverter并覆盖WriteJson并编写逻辑以仅序列化所需的数据。请务必覆盖CanConvertCanWrite。 您可以查看链接Custom conversion of specific objects in JSON.NET以获得想法

对于ContractResolver,请参阅链接http://quickduck.com/blog/2011/08/08/overriding-the-default-serialization-behavior-in-json-net/。在此,而不是使用base.CreateObjectContract( objectType );使用new JsonObjectContract( objectType );

希望这有帮助

答案 2 :(得分:0)

创建一个只实现接口的新类(创建一个“viewmodel”),用所需的字段初始化该类并返回该对象是一个解决方案。

或者如果可能,将字段标记为私有。私有字段不会被序列化。 (限制田地的可见度总是一件好事)