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



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

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

问题在于 Web API 始终序列化模型中的每个字段,即使它不是要返回的接口的一部分。我们如何只能在返回的接口中序列化字段?

我知道如何自动化特定接口而不是整个对象的序列化过程。
我编写了包含此类代码的库(现在这段代码由 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()));

我认为您可以使用JsonConverter或使用ContractResolver来做到这一点

创建JsonConverter并重写WriteJson并编写逻辑以仅序列化所需的数据。请记住覆盖CanConvertCanWrite。您可以查看链接 JSON.NET 中特定对象的自定义转换以获得想法

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

希望这有帮助

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

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

最新更新