2012-08-17 4 views
6

MVC4 WebAPI(RTM - 今日はVS2012 RTMがインストールされましたが、昨日はRCでこの問題が発生していました)でJSONとしてオブジェクトをシリアル化しようとしています。すべてのnullがJSON出力にレンダリングされます。このよう :MVC4を作成できませんWebApiにJSONのnullフィールドが含まれています

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

しかし、どのようなImはなっては、私はこのQを見つけた

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

/あるWebApi doesnt serialize null fieldsが、答えはどちらか私のために動作しませんか私はどこを把握するために失敗しています答えを入れる。ここで

は、私が試したものです:Global.asax.csさんのApplication_Startで

  1. を、私が追加:

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

    は、これは(ように見える)しないエラーと、実際に実行するようです私が試した次のものを見ることに基づいています。 (ApiControllerのサブクラスで)制御方法において

  2. 、追加:

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

    を私はスルー段差として#2の両方の値が既にそれらの行の前に設定したので、実行#1が実行されたと言います。絶望の動きで

  3. 私がnullと欠席したプロパティにこのATTRIBを追加してみました(私は本当にすべてのオブジェクトのすべてのプロパティを飾るためにしたくないので):

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

すべて3つはヌルプロパティーを省略した同じJSONを生成します。

その他の注意事項:

  • IISでローカルに実行するには、Windows 7、VS2012 RTM、(あまりにもに建設しようとしました)。
  • コントローラメソッドが返されます。リストされたIEnumerableも返されます。
  • シリアル化しようとしているオブジェクトはpocosです。

答えて

1

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

私はVS2012 RTMをインストールしましたが、私のプロジェクトではまだベータ版のすべてのナゲットパッケージが使用されていました。だから、私はすべてのもののために更新しました(すべてのナゴット?)、すべては今よく(私の質問から#1を使用して)です。私は半日を燃やしたために馬鹿だと感じていますが。

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 
}; 
+0

はそれが仕事をしたが判明 - または持っている必要があります。私は自分自身に謙虚さの完全な線量を与えるために捻挫していたものを掲示するでしょう:) – AndrewFreese

+0

この回答には十分にありがとうございます。 – Simian

+0

DefaultValueHandlingとNullValueHandlingの両方をそれぞれのインクルード値に設定する限り、最初の変種も(シリアライザ設定の新しいインスタンスを作成せずに)動作します – Masterfu

0

私はこの回答を見て、私はすでにこれをやっていたので動揺しましたが、私の問題はまだ存在していました。私の問題は、オブジェクトがヌル可能な型を含むインタフェースを実装しているという事実に根ざしているので、私が実装したいとすれば、これらのうちの1つを持っていなければならないという契約と、それを含めないでください。ブーム!

2

Newtonsoft.Json.JsonFormatterはいくつかの奇妙な理由から、Propheties os SerializerSettingsへのアサイメントを無視します。以下に示すように、あなたの設定作業が.SerializerSettingsの新しいインスタンスを作成するためには

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

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

     }; 
+0

これはシリアライザ設定の新しいインスタンスを作成せずに動作しますDefaultValueHandlingおよびNullValueHandlingをそれぞれのInclude値に変更 – Masterfu

+0

開発およびステージングマシンでこの問題を解決するには、シリアライザ設定の新しいインスタンスをインスタンス化する必要がありました。これは、私たちの開発マシンがそれぞれの値を単純に設定することで期待通りに機能していたため、イライラした問題でした(.NETとjsonシリアライザのバージョンは一見等しいと思います)。 –

関連する問題