servicestack反序列化JSON查询字符串变量(servicestack deseriali

2019-10-17 09:29发布

在其余的服务我正在模仿另一个相同的产品,JSON是GET / POST方法在网页表单或查询字符串参数。

我的要求DTO还有一个DTO对象作为JSON属性

我可以添加RequestFilter如果它发布到解串行化的形式参数,但如果GET在查询变量使用JSON服务栈代码将抛出“KeyValueDataContractDeserializer:错误转换为类型”中StringMapTypeDeserializer异常。

在StringMapTypeDeserializer它得到了DTO的特性解析功能。 是添加的东西JsvReader.GetParseFn(属性类型)的有反正; 处理我的JSON的反序列化?

或添加解析此查询参数的一些其他的方式? 没有做一个自定义的处理程序。

谢谢

Answer 1:

ServiceStack使用JSV格式 (又名JSON不带引号)来解析查询字符串。

JSV让你嵌入查询字符串深对象图所看到这个例子网址 :

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使用,你可以注册自己的自定义请求活页夹 。



Answer 2:

我做这个自动设置自己的自定义通用请求粘结剂所有DTO的在apphost.Configure。 通过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

    }


文章来源: servicestack deserializing JSON in query string variable