控制 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 中的链接。
我想使用 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 中的链接。