我在看SS时遇到了问题。
我正在编写一个自定义Stripe实现并且卡在Web钩子上,特别是: https://stripe.com/docs/api#event_object
data-> 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内部剥离报价?这是处理可以是众多不同类型之一的json成员的正确方法吗?我确实尝试了动态的东西,但也没有任何运气 - 基本上相同的结果缺少引号。
我非常仔细地搜索了DTO中对象和动态的使用,但实际上没有什么能帮助解决这个问题。
谢谢!
答案 0 :(得分:1)
问题是你should never have an object type in DTOs因为序列化程序不知道要反序列化的具体类型。
Stripe文档说object is a hash你应该能够使用Dictionary来捕获,例如:
public class StripeEventData
{
public Dictionary<string,string> @object { get; set; }
}
或者作为替代方案,您可以使用JsonObject
来提供灵活的API来访问动态数据。
这适用于平面对象结构,但对于复杂的嵌套对象结构,您需要创建自定义类型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; }
}