控制ServiceStack反序列化POST变量并存储在对象中

时间:2015-02-05 18:42:53

标签: c# serialization servicestack servicestack-text

我想使用反序列化中内置的ServiceStack来反序列化一个post变量。但是,我想做两个更改,这将为我试图解决的另一个问题提供一些灵活性。

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

如果post变量类名与{Property}匹配,我想创建该DTO类并将其存储在Dto对象中。我希望其他所有内容都能正常反序列化。

例如,如果我发布到:&#34; 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 }

这是我可以使用请求和响应过滤器的情况吗? 我应该创建自定义请求绑定器吗? 还有另一种方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

不确定它是否是一个选项,但是从您的示例中我将包含一个CommodityType的属性,其中包含您要反序列化的类型,以便JSON Serializer可以为您填充它,例如:

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

如果它不存在就没关系,因为它只会保留为null

根据Request DTO属性的形状,另一个选项可能是使动态部分为object并配置ServiceStack的JSON Serializer以将对象类型转换为字符串Dictionary,例如:

JsConfig.ConvertObjectTypesIntoStringDictionary = true; // in AppHost

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

在这种情况下,object将被反序列化为松散类型的词典,您可以检查它在请求过滤器中将其更改为强类型。

否则,如果您想进一步更改默认的反序列化行为,则需要使用Custom Request Binder并处理自定义反序列化并自行处理反序列化。

ServiceStack.Text包括支持使用JsonObject API解析任意JSON,有关示例,请参阅Custom Deserialization中的链接。