2016-12-07 11 views
2

SSを見ているうちに問題が発生しています。ServiceStack - DTOの動的/オブジェクト

私は、カスタムのストライプの実装を書いていますし、ウェブフックに捕まってしまった、この特に: https://stripe.com/docs/api#event_object

データ - >オブジェクトを - これは何もすることができます。ここで

は、それは私のDTOです:

public class StripeEvent 
{ 
    public string id { get; set; } 

    public StripeEventData data { get; set; } 

    public string type { get; set; } 
} 

[DataContract] 
public class StripeEventData 
{ 
    [DataMember(Name = "object")] 
    public object _object { get; set; } 
} 

私の希望は、基本的には単なる文字列としてそのオブジェクトを取得し、それを解析することです:

var invoice = (StripeInvoice)JsonSerializer.DeserializeFromString<StripeInvoice>(request.data._object.ToString()); 

あいにくから返されたデータToStringには、各jsonプロパティの名前を囲む引用符はありません。

したがって、DeserializeFromStringは、すべてがゼロになっているオブジェクトを返します。

なぜSSは内部で引用符を取り除いていますか?これは、さまざまな種類のうちの1つになることができるjsonメンバーを処理する適切な方法ですか?私は動的なものを試してみましたが、どちらにも幸運がありませんでした - 基本的に引用符がない場合と同じ結果です。

私は、DTO内でオブジェクトとダイナミックの使用について非常に徹底的に調査しましたが、実際にこの質問に役立つものはありませんでした。

ありがとうございました!

+1

私はあなたの問題を再現することはできません。 'request.data._object.ToString()'は私にとっては適切なJSONオブジェクトです。それとは別に、これは良いアプローチではありません。 'object'の実際の型をチェックし、それを第一級モデルに逆直列化する必要があります。 –

+0

これを行う方法に関する提案はありますか? StripeEventの "type"値はこれを示しており、json文字列をそれぞれのクラスに解析するswitch文を作成しようとしていました。 –

+1

確か; 'invoice.updated'イベントタイプを扱っているものは、' object'プロパティが 'Invoice'であることを知るべきです –

答えて

1

シリアライザとしてshould never have an object type in DTOsには、逆シリアル化する具体的なタイプがわからないという問題があります。

ストライプドキュメントでは、キャプチャするために辞書を使用することができるはずobject is a hashを、言う例えば:

public class StripeEventData 
{ 
    public Dictionary<string,string> @object { get; set; } 
} 

それとも、動的なデータにアクセスするための柔軟なAPIを提供しJsonObjectを使用することができ、代替として

これは、平らなオブジェクト構造のために動作しますが、複雑なネストされたオブジェクト構造のためにあなたは、カスタム型付きのDTOを作成する必要があります、例えば:

public class StripeEventInvoice 
{ 
    public string id { get; set; }  
    public StripeEventDataInvoice data { get; set; } 
    public string type { get; set; } 
} 

public class StripeEventData 
{ 
    public StripeInvoice @object { get; set; } 
} 
+0

ありがとう!辞書またはJsonObjectをStripeInvoiceに変換する最良の方法は何ですか? –

+0

JsonObjectは、StripeInvoice全体ではなく、Dictionaryの代替品です – mythz

+0

私はそれを理解していますが、クラスと辞書/ JsonObjectの間に値を設定することをお勧めします。それらのいずれかを私のdtoクラス(StripeInvoice)に変換する良い方法はありますか? –

関連する問題