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

Control ServiceStack deserialization of POST variable and store in object

我想使用 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 变量 class 名称与 {属性} 匹配,我想创建该 DTO class 并将其存储在 Dto 对象中。我希望其他一切都能正常反序列化。

例如,如果我 post 到: "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 }

在这种情况下我可以使用请求和响应过滤器吗? 我应该创建一个自定义请求活页夹吗? 还有其他方法可以解决这个问题吗?

不确定它是否是一个选项,但从你的示例中我会为 CommodityType 包含一个 属性 以及你想要反序列化的类型,因此 JSON 序列化程序可以为您填充它,例如:

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

如果它不存在也没关系,因为它将保留为 null

根据请求 DTO 属性 的形状,另一种选择可能是使动态部分成为 object 并配置 ServiceStack 的 JSON 序列化程序以将对象类型转换为字符串字典,例如:

JsConfig.ConvertObjectTypesIntoStringDictionary = true; // in AppHost

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

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

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

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