0

VS 2012 を使用して Web API を作成しました。テスト用に Fiddler 経由で JSON を渡すカスタム オブジェクト パラメーターを持つメソッドがあります。

[HttpPost、HttpPut] public HttpResponseMessage UpsertProject(Projects p) { ... }

My Projects オブジェクトには、JsonIgnore としてマークされた約 12 個のプロパティがあります。私の仮定は、私のオブジェクトが Json にシリアル化されると、それらのプロパティは無視されるということでした...これは本当です。ただし、メソッドをデバッグすると、Fiddler から渡した Json がそれらを設定している場合でも、JsonIgnore でマークされたすべてのオブジェクト プロパティが null に設定されていることに気付きました。また、データを Json として取得し、それをオブジェクトの新しいインスタンスに逆シリアル化しようとしましたが、JsonIngore とマークされたプロパティも設定されません。JsonIgnore がシリアル化に機能することは知っていましたが、逆シリアル化時にプロパティが設定されなくなるとは思いませんでした。イライラするのは、ScriptIgnore がこのように動作しないことはわかっていますが、シリアル化/逆シリアル化を処理するために JSON.net を使用したいということです。私' また、Windows アプリを作成し、同じシリアル化/逆シリアル化機能をテストしたところ、そのアプリで動作しました。これは JsonIgnore 属性による Web API の制限でしょうか?

4

1 に答える 1

0

Windows アプリケーションでは思いどおりに動作し、Web API では動作しない場合は、JSON シリアライザーの設定が 2 つの間で異なっていることがわかります。Windows アプリでどのような設定を使用して動作させていますか? これらの設定を取得して、クラスのRegisterメソッド( Web API プロジェクトのフォルダー内) で Web API シリアライザーに適用できます。例えば:WebApiConfigApp_Start

JsonSerializerSettings jsonSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSettings.NullValueHandling = NullValueHandling.Ignore;
jsonSettings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
...

編集

OK、あなたの最新のコメントに基づいてあなたを正しく理解していれば、可能であればすべてを逆シリアル化する必要がありますが、シリアル化する特定のプロパティは 2 つだけで、それらには明らかに null またはデフォルト値がありません。その場合、次の 2 つの方法があります。

  1. シリアル化する直前に、シリアル化したくないプロパティを null またはゼロまたは false (既定値) に設定します。にDefaultValueHandling設定したためIgnore、これらのプロパティはシリアル化されません。

  2. クラスにいくつかのブール値ShouldSerializeXXX()メソッドを作成します。ここで、XXX はシリアル化したくない各プロパティの名前です。これらのメソッドは を返す必要がありfalseます。例については、この質問の最初の回答を参照してください。

JsonIgnoreご覧のとおり、これにより、シリアル化と逆シリアル化の両方で、プロパティが Json.Net によって完全に無視されるため、使用しないでください。

于 2013-05-02T03:02:16.760 に答える