5
using Newtonsoft.Json;

namespace FAL.WebAPI2012.Controllers
{
    public class Person
    {
        public int Id {get;set;}
        public string FirstName {get;set;}
        public string LastName {get;set;}

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include, 
            NullValueHandling = NullValueHandling.Include)]
        public DateTime? Dob { get; set; }
    }

    public class TestNullsController : ApiController
    {
        // GET api/<controller>
        public Person Get()
        {
            Person myPerson = new Person() { 
                Dob = null, FirstName = "Adrian", Id=1, LastName="Bobby"
            };

            return myPerson;
        }
    }
}

ご覧のとおり、私のDobフィールドはnullに設定されていますが、結果は次のようになります。

{ "Id":1, "FirstName":"Adrian", "LastName":"Bobby" }

そして、Dob私が必要とするnullにシリアル化されていません!

(名前などの他の属性を設定していることをテストしましたJsonPropertyが、JSON出力が完全に変更されます。null許容プロパティをシリアル化できません。また、Json.Net(以下の回答を参照)をテストしたので、私の考えはそのWebAPIセットアップはどこかで何かをオーバーライドしているので、どこにあるかを知っておくと便利です)。

4

2 に答える 2

5

問題はどこかにあるように見えます。コンソールアプリケーションで次のことを行いました。

using System;
using System.IO;
using Newtonsoft.Json;

namespace JsonNetNullablePropertyTest
{
    class Program
    {
        static void Main()
        {
            var myPerson = new Person {
                Dob = null,
                FirstName = "Adrian",
                Id = 1,
                LastName = "Bobby"
            };

            using (var textWriter = new StringWriter())
            using (var writer = new JsonTextWriter(textWriter))
            {
                // Create the serializer.
                var serializer = new JsonSerializer();

                // Serialize.
                serializer.Serialize(writer, myPerson);

                // Write the output.
                Console.WriteLine(textWriter);
            }
        }
    }

    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }

        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include,
            NullValueHandling = NullValueHandling.Include)]
        public DateTime? Dob { get; set; }
    }
}

そして、出力は次のとおりです。

{"Id":1,"FirstName":"Adrian","LastName":"Bobby","Dob":null}

予想通り。

問題は、インスタンスJsonSerializerをシリアル化するために実際にを呼び出す方法にあるように思われます。Person

于 2012-07-16T19:32:50.983 に答える
2

この返信は、Microsoftのweb.apiのメンバーから受け取りました。

'これがRC以降に修正されたことを知って喜ぶでしょう:

http://aspnetwebstack.codeplex.com/workitem/243

新しいパッケージにアップグレードするか、次のように設定を上書きすることができます。

JsonFormatter.SerializerSettings = new JsonSerializerSettings(){NullValueHandling = NullValueHandling.Include};

お役に立てば幸いです」

したがって、すべてがその更新で機能します。

于 2012-07-18T12:38:43.823 に答える