如何让ServiceStack根据请求序列化动态(ExpandoObject)属性

时间:2013-09-12 13:56:14

标签: json serialization servicestack expandoobject dynamicobject

是否有任何额外的配置可以让ServiceStack将JSON请求反序列化为适当的动态对象?我编译了包含DynamicJson类的ServiceStack.Text库的Net40版本,并将其添加到我的项目中。我有一个标准的请求和响应DTO。请求DTO具有动态(ExpandoObject)公共属性。进入我的服务操作后,动态属性似乎没有正确序列化。在客户端,JSON被完美地反序列化。

以下是我的工作内容:

请求,响应和服务

[Route( "/foo/subscriptions", "POST")]
[DataContract( Name = "UpdateSubscription")]
public class UpdateSubscriptionMessage 
    : IReturn<UpdateSubscriptionMessageResponse>
{
    dynamic _subscription;

    public UpdateSubscriptionMessage() {
        _subscription = new ExpandoObject();
    }

    [DataMember( Name = "subscription" )]
    public dynamic Subscription { 
        get { return _subscription; } 
        set { _subscription = value; } 
    }
}

[DataContract( Name = "UpdateSubscriptionResponse")]
public class UpdateSubscriptionMessageResponse
{
    [DataMember( Name = "success" )]
    public bool Success { get; set; }

    [DataMember( Name = "subscriptionId" )]
    public int Id { get; set; }
}

public class SubscriptionTestService : BaseService
{
    private IAdminComponent _adminComponent;

    public SubscriptionTestService() : this (null) { }

    public SubscriptionTestService(IAdminComponent adminComponent) {
        _adminComponent = adminComponent;
    }

    public UpdateSubscriptionMessageResponse Post( UpdateSubscriptionMessage request)
    {
        var response = new UpdateSubscriptionMessageResponse();

        dynamic subscription = request.Subscription;

        return response;
    }
}

JSON POST Body

{ 
  "subscription": 
  { 
    "name":"foo subscription title", 
    "description":"the description" 
  }
}

发布JSON并进入我的服务操作后,快速查看请求会将dynamic Subscription显示为字符串。 ServiceStack可以将JSON请求序列化为dynamic吗?

Peek at request.Subscription Visualizer QuickWatch confirms the type is a string

1 个答案:

答案 0 :(得分:2)

You may have seen this announcement:

  

下一个主要的v4.0也将是一个“破发版”,其新功能受到“AGPL / FOSS许可例外”的保护,并包含一些随时间积累的重大变化,包括升级所有项目(对.NET 4+),主要代码和NuGet包重新分解,清理和删除已弃用的代码,更好地一致性/简化一些概念和实现一些路线图功能我一直想添加但从未有时间对于。修复和发布将继续v3.x并在单独的v3分支中维护,直到v4.0出现测试版。

由于没有理由在当前的3.x分支中修复动态对象支持,该分支不支持.Net4.0,答案是“不,ServiceStack无法将JSON请求序列化为动态”。

您始终可以在“&gt; = .Net4.0 only”分支中分叉代码并添加缺少的支持。具有该修复程序的pull请求可能不会被接受到3.x内核中,但是对于即将发布的v4.0版本可能会受欢迎。

或者,ServiceStack的JSON序列化程序JsConfig<T>.RawSerializeFnJsConfig<T>.RawDeserializeFn中有自定义序列化函数的钩子。结合serializing ExpandoObjects in .Net 4.0上的这个答案,这将允许您添加ExpandoObject序列化支持,而无需“修复”核心代码。