【问题标题】:How to get ServiceStack to serialize a dynamic (ExpandoObject) property on request如何让 ServiceStack 根据请求序列化动态(ExpandoObject)属性
【发布时间】:2013-09-12 13:56:13
【问题描述】:

是否有任何额外的配置需要让 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 正文

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

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

【问题讨论】:

  • 我会关注这个问题,因为我需要自己工作的答案。您能指出您正在使用的“Net40 版本的 ServiceStack.Text 库”吗?
  • @marfarma 您需要提取 ServiceStack.Text source。一旦你拥有它,你会发现一个ServiceStack.Text.Net40 .sln。我从那里编译并将 ServiceStack.Text 程序集添加到我的项目中。

标签: json serialization servicestack expandoobject dynamicobject


【解决方案1】:

You may have seen this announcement:

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

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

您始终可以分叉代码并在 ">= .Net4.0 only" 分支中添加缺少的支持。带有该修复的拉取请求可能不会被 3.x 核心接受,但可能会在即将到来的 v4.0 版本中受到欢迎。

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

【讨论】:

  • 更新了答案,其中包含有关 ServiceStack 自定义序列化挂钩的信息,作为修补核心的替代方法。
猜你喜欢
  • 2017-05-10
  • 2011-10-31
  • 2012-03-12
  • 1970-01-01
  • 2015-07-14
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多