3

プロパティの 1 つが DateTime である複合オブジェクトを受け入れる Web API コントローラー メソッドがあります。オブジェクトを XML として投稿すると、すべて正常に動作します。ただし、JSON として投稿すると失敗します。

失敗する理由についてさらに情報を得るために、Json.Net に付属の基本的な IsoDateTimeConverter を再利用し、変換された値にブレークポイントを配置して、カスタムの日時コンバーターを追加しました。値は正常に変換されますが、モデルに到達すると、送信している値ではなく、新しい日時がプロパティに入力されます。XML とまったく同じモデルを送信すると問題なく動作します。

イベントのシーケンスと、それが datetime オブジェクトに変換されてからモデルがバインドされるまでに即座に失われる方法について、私は少し混乱しています。シリアル化と逆シリアル化のために、相互作用の両端で Json.Net IsoDateTimeConverter を使用しています。

JSON 設定:

NullValueHandling = NullValueHandling.Ignore,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
Converters = new JsonConverter[]
{
    new StringEnumConverter(),
    new IsoDateTimeConverter()
}

Web API エンドでの逆シリアル化に使用されるカスタム コンバーター (IsoDateTimeConverter を使用):

public class CustomDateTimeConverter : DateTimeConverterBase
{
    IsoDateTimeConverter isoConverter;

    public CustomDateTimeConverter()
    {
        isoConverter = new IsoDateTimeConverter();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        isoConverter.WriteJson(writer, value, serializer);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var returned = isoConverter.ReadJson(reader, objectType, existingValue, serializer);
        return returned;
    }
}

モデルの Date プロパティ (両端)

public DateTime DateOfBirth { get; set; }

投稿される Json 形式:

"DateOfBirth":"1980-02-01T00:00:00"

コンバーターでの値:

{01/02/1980 00:00:00}

コントローラーのモデルの値:

{01/01/0001 00:00:00}

ブレークポイントが設定されたときに返される変数は、正しい逆シリアル化された日時を示していますが、直後のモデルは新しい日時です。

これがどのようにデシリアライズできるかについてかなり混乱していて、すぐにはデシリアライズできないと判断しました! どんな助けでも大歓迎です。

さらに調査すると、json バインダーも一般的にプロパティのバインドに失敗しているようです。基本的な文字列プロパティのロードが正しくバインドされていないため、これは別の問題の一部である可能性があります。

4

3 に答える 3

4

Json は日付を実行しません。それらを文字列として返し、クライアント スクリプトで解析します。

http://www.hanselman.com/blog/OnTheNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx

于 2013-03-15T15:51:46.637 に答える
0

これは JSON とは関係がないことが判明しました。日付コンバーターをオーバーライドしてわかったように、JSON は正しく逆シリアル化されていました。問題は、必須フィールドを適用するために、オブジェクトに必須フィールドがあり、Web API で [DataMember(IsRequired = true)] が必要であることです。問題は、オブジェクトの残りの部分が [DataMember] 属性で装飾されていなかったため、無視されていたという事実にありました-モデルがバインドされたときだと思います。

特に解決策が非常に単純な場合は、追跡するのが面倒なバグです...

于 2013-03-18T10:36:26.890 に答える