3

部分応答をサポートするWebAPIを実装しています。

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

クラスUserが与えられた

[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 に答える