2

前回のSOの質問では、ASP.NET Web APIが(逆)シリアル化にネイティブに使用するJson.NETのシリアライザー設定を変更する方法を尋ねました。受け入れられた答えは完全に機能し、たとえば、シリアル化されたJSON文字列に型情報を埋め込むことができました。

ただし、このJSON文字列をモデルの親クラスを予期しているWeb APIアクションに戻そうとすると、Web APIは引き続き親クラスに逆シリアル化し、子クラスに対応するすべてのデータを削除し、子へのキャストと子の検出を防ぎます。クラス。

class Entity { }
class Person : Entity { }

public Person Get() {
    return new Person();
}

public bool Post(Entity entity) {
    return entity is Person;
}

単純なユースケースは、jQueryで次のようなことを行うことです。

// get a serialized JSON Person
$.ajax({
    url : 'api/person'      // PersonController
}).success(function (m) {

    // then throw that Person right back via HTTP POST
    $.ajax({
        url : 'api/person',
        type : 'POST',
        data : m
    }).success(function (m) {
        console.log(m);     // false
    });

})

Json.NETのを変更してJsonSerializerSettings型情報を埋め込むことで、それを読み取ることができ、少なくともその型に逆シリアル化を強制しようとすることを期待しますが、明らかにそうではありません。

このようなことにどのように取り組むべきですか?

4

2 に答える 2

1

Web API は実際には「ネイティブに」シリアル化 (逆) を行いません。デフォルトで config.Formatters コレクションにいくつかの MediaTypeFormatters が含まれています。それらを自由に削除して、希望する方法でシリアル化を処理する独自の MediaTypeFormatter を作成してください。

MediaTypeFormatters の作成はそれほど難しくありません。

于 2012-11-09T15:09:07.097 に答える
1

実際には、2 回目の POST 呼び出しは application/x-www-form-urlencoded データを送信しているため、型情報が JsonMediaTypeFormatter によって取得されません。contentType を「application/json」に設定してみてください。

また、2 番目の POST リクエスト本文のデータはエンコードされているようで、サービスに送り返す前にデコードする必要があります。

これを機能させることができました:

    // get a serialized JSON Person
    $.ajax({
        url: 'api/person'      // PersonController
    }).success(function (m) {

        // then throw that Person right back via HTTP POST
        $.ajax({
            url: 'api/person',
            type: 'POST',
            contentType: "application/json",
            data: JSON.stringify(m),
        }).success(function (m) {
            alert(m);     // true!
        });

    })
于 2012-11-09T16:59:21.050 に答える