0

ServiceStack のビルトイン デシリアライゼーションを使用してポスト変数をデシリアライズしたいと考えています。しかし、解決しようとしている別の問題に柔軟に対応できるように、2 つの変更を加えたいと思います。

[Route("/MyObject/{Property}", "POST")] OtherRoutes... public class MyObject:IReturn<MyObjectResponse>{ public string Property{ get; set; } public object Dto{ get; set; } Other properties... } public class CommodityType{ public int Id{ get; set; } public string CommodityTypeName{ get; set; } }

投稿変数のクラス名が {Property} と一致する場合、その DTO クラスを作成し、それを Dto オブジェクトに格納します。他のすべてを正常にデシリアライズしたい。

たとえば、「example.com/API/MyObject/CommodityType」に次の json を投稿した場合:

{ "CommodityType":{ "Id": 1, "CommodityTypeName": "Commercial Services" } }

if(MyObject.Property == POST.ObjectName){ // in this example Post.ObjectName = "CommodityType" // Use Reflection to create object of type MyObject.Property // Deserialize into the object created by reflection // MyObject.Dto = Deserialized object }

これは、リクエスト フィルタとレスポンス フィルタを使用できる状況ですか? カスタム リクエスト バインダーを作成する必要がありますか? これにアプローチする別の方法はありますか?

4

1 に答える 1

0

それがオプションかどうかはわかりませんが、あなたの例から、CommodityTypeデシリアライズしたいタイプのプロパティを含めて、JSONシリアライザーがそれを入力できるようにします。

public Request
{
    public CommodityType CommodityType { get; set; }
}

として残されるので、存在しなくても問題ありませんnull

Request DTO プロパティの形状によっては、別のオプションとして、動的部分を作成し、objectオブジェクト タイプを文字列ディクショナリに変換するように ServiceStack の JSON シリアライザーを構成することもできます。次に例を示します。

JsConfig.ConvertObjectTypesIntoStringDictionary = true; // in AppHost

public Request
{
    public object CommodityType { get; set; }
}

その場合object、緩い型のディクショナリに逆シリアル化されます。これを検査して、リクエスト フィルターで強い型に変更できます。

それ以外の場合、デフォルトの逆シリアル化の動作をさらに変更する場合は、カスタム リクエスト バインダーを使用してカスタムの逆シリアル化を処理し、逆シリアル化を自分で処理する必要があります。

JsonObjectServiceStack.Text には、 APIを使用して任意の JSON を解析するためのサポートが含まれています。いくつかの例については、カスタム デシリアライゼーションのリンクを参照してください。

于 2015-02-05T19:16:57.640 に答える