0

我想使用 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 对象中。我希望其他所有内容都能正常反序列化。

例如,如果我发布到:“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 }

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

4

1 回答 1

0

不确定它是否是一个选项,但是从您的示例中,我将包含一个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将被反序列化为松散类型的字典,您可以在请求过滤器中检查将其更改为强类型。

否则,如果您想进一步更改默认反序列化行为,则需要使用自定义请求绑定器并处理自定义反序列化并自己处理反序列化。

ServiceStack.Text 包括对使用JsonObjectAPI 解析任意 JSON 的支持,请参阅自定义反序列化中的链接以获取一些示例。

于 2015-02-05T19:16:57.640 回答