【问题标题】:ServiceStack and dynamic properties in request DTOs请求 DTO 中的 ServiceStack 和动态属性
【发布时间】:2013-03-20 16:29:58
【问题描述】:

我想将 JSON 对象发布到我的服务堆栈服务并在请求 DTO 中使用动态属性。到目前为止,我尝试过的所有方法都将对象保留为 NULL 值。

我使用的 javascript 代码:

$.getJSON(
  "/api/json/reply/Hello",
  {
    Name: "Murphy",
    Laws: {
      SomeProp: "A list of my laws",
      SomeArr: [
        { Title: "First law" },
        { Title: "Second law" },
        { Title: "Third law" }
      ]
    }   
},
function(data) {
    alert(data.result);
  }
);

接收请求的 DTO:

public class Hello
{
    public string Name { get; set; }
    public dynamic Laws { get; set; }
}

我还尝试在 DTO 中使用对象和 JsonObject 而不是动态的。

为了完整,这里也是服务:

public class HelloService : Service
{
    public object Any(Hello request)
    {
        return new HelloResponse { Result = "Hello, " + request.Name };
    }
}

Murphy 在 Name 属性中没有任何问题,但 Laws 属性仍然为 NULL。

最后,我想以某种方式迭代(使用反射?) Laws 属性并获取所有包含的属性和值。

我不能在这里使用类型化的 DTO,因为在开发时我不知道 Laws 属性的 JSON(而且它可以经常更改)。

感谢您的帮助!

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    在 NuGet 上构建的 ServiceStack 的 .NET 3.5 库不具有对 .NET 4.0+ dynamic 类型的本机支持。您可以将 JSON 传递给 string 属性并在服务器上动态解析它:

    public object Any(Hello request)
    {
        var laws = JsonObject.Parse(request.Laws);
        laws["SomeProp"] //
        laws.ArrayObjects("SomeArr") //
    }
    

    否则,您可以使用 Dictionary<string,string> 或者如果您在 AppHost 中指定:

    JsConfig.ConvertObjectTypesIntoStringDictionary = true;
    

    您可以使用object,它将对象视为字符串字典。

    否则动态不应该在 DTO 上,因为它对于服务的期望没有意义。您可以将其添加到 QueryString。您可以使用JSV Format 在QueryString 中指定复杂的对象图,例如:

    /hello?laws={SomeProp:A list of my laws,SomeArr:[{Title:First Law}]}
    

    注意:上面的空格在线路上用%20 编码。

    您可以通过以下方式在您的服务中访问哪些内容:

    public object Any(Hello request)
    {
        var laws = base.QueryString["laws"].FromJsv<SomeTypeMatchingJsvSent>();
    }
    

    【讨论】:

    • 首先,非常感谢您的回答。当您说“.NET 3.5 构建...”时 - 这是否意味着某处存在具有该功能的构建
    • 还没有整个项目套件,但是有一个支持动态的 .NET 4.0 ServiceStack.Text 项目,一旦我们提供 .NET 4.0 构建,我们将着眼于更好地支持动态全面。
    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多