2016-12-07 3 views
2

SS를 보면서 문제가 발생합니다.ServiceStack - DTO의 동적/객체

나는 특히이 사용자 정의 스트라이프 구현을 쓰고 있어요 및 웹 후크에 붙어있어 : https://stripe.com/docs/api#event_object

데이터 -> 개체 -이 아무것도 할 수있다. 여기

은 내 DTO입니다 :에서 반환

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

불행하게도 데이터 :

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; } 
} 

내 희망은 기본적으로 그냥 문자열로 객체를 얻고, 다음의 구문을 분석하는 것입니다 ToString에는 json 속성의 이름을 둘러싼 따옴표가 없습니다.

Capture

그래서 DeserializeFromString은 모든 것이 제거 된 객체를 반환합니다.

SS가 내부적으로 따옴표를 제거하는 이유는 무엇입니까? 이것은 여러 가지 유형 중 하나 일 수있는 JSON 멤버를 처리하는 적절한 방법입니까? 나는 역동적 인 것들을 시도했지만 그 중 하나도 행운이 없었습니다 - 기본적으로 누락 된 따옴표가있는 동일한 결과.

DTO 내에서 개체와 동적 사용을 매우 철저히 조사했지만 실제로이 질문에 도움이되는 것은 없었습니다.

감사합니다.

+1

나는 당신의 문제를 재현 할 수 있습니다. 'request.data._object.ToString()'은 나를위한 적절한 JSON 객체이다. 그 외에는 좋은 접근 방법이 아닙니다. 당신은'object'의 실제 타입을 확인하고 그것을 deserialize하여 일류 모델로 만들어야합니다. –

+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)로 변환하는 좋은 방법이 있습니까? –