servicestack在查询字符串变量中反序列化JSON

时间:2012-11-07 08:33:31

标签: servicestack

在休息服务中我仿效与另一个产品相同,json以Web表单或查询字符串参数进行GET / POST。

我的请求DTO有另一个DTO对象作为json

的属性

如果表单参数是POST,我可以添加一个RequestFilter来反序列化表单参数,但是如果GET与查询变量中的json一起使用,服务栈代码将在StringMapTypeDeserializer中抛出“KeyValueDataContractDeserializer:Error转换为类型”异常。

在StringMapTypeDeserializer中,它获取DTO属性的解析函数。有没有向JsvReader.GetParseFn(propertyType)添加内容;处理我的JSON的反序列化?

或者为此查询参数添加解析的其他方法?没有做自定义处理程序。

感谢

2 个答案:

答案 0 :(得分:2)

ServiceStack使用JSV Format(也就是没有引号的JSON)来解析QueryStrings。

JSV允许您在QueryString中嵌入深层对象图,如this example url所示:

http://www.servicestack.net/ServiceStack.Examples.Host.Web/ServiceStack/Json/
SyncReply/StoreLogs?Loggers=[{Id:786,Devices:[{Id:5955,Type:Panel,
  Channels:[{Name:Temperature,Value:58},{Name:Status,Value:On}]},
  {Id:5956,Type:Tank,TimeStamp:1199303309,
  Channels:[{Name:Volume,Value:10035},{Name:Status,Value:Full}]}]}]

如果您想更改ServiceStack使用的默认绑定,您可以注册自己的Custom Request Binder

答案 1 :(得分:0)

我这样做是为apphost.Configure中的所有dto自动设置我自己的自定义通用请求绑定器。迭代通过EndpointHost.Config.ServiceController.AllOperationTypes好吗?

    public static void Register(IAppHost appHost)
    {

        foreach (Type t in EndpointHost.Config.ServiceController.AllOperationTypes)
        {
            var method = typeof(MyFormatClass).GetMethod("DeserializationRequestBinder");
            var genericMethod = method.MakeGenericMethod(t);
            var genericDelegate = (Func<IHttpRequest, object>) Delegate.CreateDelegate( typeof( Func<IHttpRequest, object> ), genericMethod);

            // add DeserializationRequestBinder<t> to serivcestack's RequestBinders
            appHost.RequestBinders.Add(t, genericDelegate);
        }
    }


    public static object DeserializationRequestBinder<RequestDTO>(IHttpRequest httpReq)
    {
        // uses a few of the extension methods from ServiceStack.WebHost.Endpoints.Extensions.HttpRequestExtensions
        var requestParams = httpReq.GetRequestParams();            

    // create <RequestDTO> and deserialize into it

    }