C# 基于返回类型接口限制Web API序列化的模型数据字段

C# 基于返回类型接口限制Web API序列化的模型数据字段,c#,mvvm,asp.net-web-api,json.net,C#,Mvvm,Asp.net Web Api,Json.net,我们正在更新我们的体系结构,以便为桌面、web和移动设备使用可在MVVM模式中使用的单一对象模型。我希望能够通过使用控制器上的接口来限制通过Web API序列化的数据字段。这是必需的,因为移动设备的模型对象存储在HTML5本地存储中,因此不携带可选数据,而瘦桌面客户端将能够存储(并处理)更多数据 为了实现这一点,模型将实现不同的接口,这些接口定义哪些数据字段应该被序列化,并且将有一个特定于接口的控制器 问题是Web API总是序列化模型中的每个字段,即使它不是要返回的接口的一部分。如何只序列化返

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

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


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

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

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

我认为您可以使用JsonConverter或使用ContractResolver来实现这一点

创建
JsonConverter
并重写
WriteJson
,然后编写逻辑以仅序列化所需的数据。记住覆盖
CanConvert
CanWrite
。 你可以看一下这个链接来获得一个想法

有关ContractResolver,请参阅链接。在这种情况下,不使用
base.CreateObjectContract(objectType)使用
新的JsonObjectContract(objectType)


希望这有帮助

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

public static dynamic to dynamic(此T值,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()));
IReadOnlyList clubs=retrieving.GetClubs(页面、大小、标准);
返回此.Request.CreateResponse(HttpStatusCode.OK,clubs.Select(item=>item.ToDynamic());

本例中的ViewModel将以TypeScript编写,因为它将在移动设备上的浏览器中运行。我特别想要一种不必将模型转换为新的具体类型即可返回模型的方法。链接似乎已断开。@TroyGizzi我已更新了链接(因此现在它指向原始版本)。但我不确定它是否是最新版本。从那一刻起,发生了很多事情,许多代码被重新组织。但如果有什么问题,请告诉我,我会带着最新版本或固定版本回来。当然,你也可以自由地用自己的软件更新它
IReadOnlyList<IClub> clubs = retrieving.GetClubs(page, size, criteria);

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