6

MVC4 WebAPI (RTM - VS2012 RTM を今日インストールしたばかりですが、昨日 RC でこの問題が発生していました) を使用してオブジェクトを JSON としてシリアル化しようとしています。JSON 出力ですべての null をレンダリングしたいと思います。このような:

[{"Id": 1, "PropertyThatMightBeNull": null},{"Id":2, "PropertyThatMightBeNull": null}]

しかし、私が得ているのは

[{"Id":1},{"Id":2}]

この Q/A WebApi は null フィールドをシリアル化しないことがわかりましたが、答えがうまくいかないか、答えをどこに置くべきか把握できていません。

これが私が試したことです:

  1. Global.asax.cs の Application_Start に、以下を追加しました。

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
    json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;
    json.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
    

    これはエラーではなく(ないように見えます)、次に試したものを見ると実際に実行されるようです。

  2. コントローラー メソッド (ApiController のサブクラス) に、以下を追加しました。

    base.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;
    base.Configuration.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
    

    #1 が実行されたと言います。これは、#2 の両方の値が、ステップ実行時にこれらの行が実行される前に既に設定されているためです。

  3. 絶望的な動きで(すべてのオブジェクトのすべてのプロパティを本当に装飾したくないため)、この属性をnullで存在しないプロパティに追加しようとしました:

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include,
        NullValueHandling = NullValueHandling.Include)]
    

3 つすべてで、null プロパティが省略された同じ JSON が生成されます。

その他の注意事項:

  • IIS(組み込みも試しました)、Windows 7、VS2012 RTMでローカルに実行しています。
  • コントローラ メソッドは List を返します -- IEnumerable も試しました
  • シリアル化しようとしているオブジェクトは pocos です。
4

4 に答える 4

10

これは機能しません:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;

しかし、これはします:

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() 
{ 
NullValueHandling = Newtonsoft.Json.NullValueHandling.Include
};
于 2012-08-17T08:05:57.477 に答える
2

奇妙な理由により、Newtonsoft.Json.JsonFormatter は、SerializerSettings のプロパティへの割り当てを無視します。

設定を機能させるには、以下に示すように .SerializerSettings の新しいインスタンスを作成します。

config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings
        {

            DefaultValueHandling =   Newtonsoft.Json.DefaultValueHandling.Include,
            NullValueHandling = Newtonsoft.Json.NullValueHandling.Include,

        };
于 2014-12-02T19:40:29.473 に答える
1

私はついにこれに出くわしましたhttp://forums.asp.net/t/1824580.aspx/1?Serializing+to+JSON+Nullable+Date+gets+ommitted+using+Json+NET+and+Web+API+にもかかわらず+specifying+NullValueHandlingは、RTM 用に修正されたベータ版のバグとして私が経験していたことを説明しています。

VS2012 RTM をインストールしましたが、私のプロジェクトでは、ベータ版に付属していたすべての nuget パッケージをまだ使用していました。それで、私はすべての更新をナゲット(ナゴット?)し、すべてがうまくいきました(私の質問の#1を使用)。半日燃やしたのはばかげていますが。

于 2012-08-17T13:07:24.090 に答える
0

この回答を見たとき、私はすでにこれを行っていたにもかかわらず、私の問題がまだ存在していたので動揺しました。私の問題は、オブジェクトが null 許容型を含むインターフェイスを実装したという事実に根ざしていたので、私を実装したい場合はこれらのいずれかが必要であるという契約と、それらのいずれかが null であるかどうかを示すシリアライザーがありました。含めないでください。ブーム!

于 2014-08-26T13:40:09.780 に答える