2016-12-07 5 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:

Capture

Итак, DeserializeFromString возвращает объект, у которого все вышло из строя.

Почему SS внутренне лимитирует кавычки? Это правильный способ обработки члена json, который может быть одним из многих разных типов? Я действительно пробовал динамический материал, но мне тоже не повезло - в основном тот же результат с отсутствующими кавычками.

Я искал очень тщательно для использования объектов и динамических в DTO, но действительно ничего не помогло в этом вопросе.

Спасибо!

+1

Я не могу воспроизвести вашу проблему. 'request.data._object.ToString()' является правильным JSON-объектом для меня. Помимо этого, это не очень хороший подход; вы должны проверить фактический тип 'object' и десериализовать его в первоклассную модель. –

+0

Любые предложения о том, как это сделать? Значение «type» в StripeEvent указывает на это, и я собирался сделать оператор switch для анализа строки json в соответствующем классе. –

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

Или в качестве альтернативы можно использовать JsonObject, которая обеспечивает гибкое API для доступа динамических данных.

Это будет работать для плоских структур объектов, но для сложных вложенных структур объектов вам необходимо создать пользовательские типизированных DTOs, например:

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 – mythz

+0

Я понимаю это, но было бы предпочтительнее заполнить класс и словарь/JsonObject. Есть ли хороший способ конвертировать любой из них в класс dto (StripeInvoice)? –