3

我正在实现一个支持部分响应的 Web API。

/api/users?fields=id,name,age

给定类用户

[JsonObject(MemberSerialization.OptIn)]
public partial class User
{
  [JsonProperty]
  public int id { get; set; }

  [JsonProperty]
  public string firstname { get; set; }

  [JsonProperty]
  public string lastname { get; set; }

  [JsonProperty]
  public string name { get { return firstname + " " + lastname; } }

  [JsonProperty]
  public int age { get; set; }
}

Json 格式化程序在序列化所有属性时效果很好,但我无法在运行时修改它以告诉它忽略某些属性,具体取决于查询参数“字段”。

我正在使用 JsonMediaTypeFormatter。

我已经按照http://tostring.it/2012/07/18/customize-json-result-in-web-api/来自定义格式化程序,但我找不到任何关于如何强制格式化程序的示例忽略一些属性。

4

3 回答 3

4

创建自己的IContractResolver来告诉 JSON.NET 哪些属性需要序列化。官方文档中有一个示例,您可以从中汲取灵感

于 2012-11-28T15:12:52.213 回答
3

只是添加到这里已经有的回复;我找到了一个为你做这个的 nuget 包

WebApi.PartialResponse

Git 中心源代码:
https ://github.com/dotarj/PartialResponse

它本质上包装了上面讨论的格式化程序,因此您只需像这样配置它:

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new PartialJsonMediaTypeFormatter() { IgnoreCase = true });

然后,您可以?fields=<whatever>在请求中指定,它会返回仅指定了那些字段的模型。

于 2014-10-09T17:26:59.273 回答
1

您还可以通过添加与属性同名的布尔方法来有条件地序列化属性,然后在方法名称前加上 ShouldSerialize。方法的结果决定了属性是否被序列化。如果该方法返回 true,则该属性将被序列化,如果它返回 false,则该属性将被跳过。

public class Employee
{
  public string Name { get; set; }
  public Employee Manager { get; set; }

  public bool ShouldSerializeManager()
  {
      // don't serialize the Manager property if an employee is their own manager
      return (Manager != this);
  }
}
于 2014-02-14T02:38:50.247 回答