请求DTO中的ServiceStack和动态属性

时间:2013-03-20 16:29:58

标签: servicestack

我想将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(它可以经常更改)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:5)

NuGet上的ServiceStack .NET 3.5库构建版本没有.NET 4.0+ 动态类型的本机支持。您可以将JSON传递到字符串属性,并在服务器上动态解析它:

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>();
}