请求DTO中的ServiceStack和动态属性

knu*_*erd 4 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);
  }
);
Run Code Online (Sandbox Code Playgroud)

DTO接收请求:

public class Hello
{
    public string Name { get; set; }
    public dynamic Laws { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

要完成,这里也是服务:

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

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

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

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

谢谢你的帮助!

myt*_*thz 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") //
}
Run Code Online (Sandbox Code Playgroud)

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

JsConfig.ConvertObjectTypesIntoStringDictionary = true;
Run Code Online (Sandbox Code Playgroud)

您可以使用object哪个会将对象视为字符串字典.

否则动态不应该在DTO上,因为它对于服务期望的内容毫无意义.您可以将它添加到QueryString.您可以使用JSV格式在QueryString中指定复杂的对象图,例如:

/hello?laws={SomeProp:A list of my laws,SomeArr:[{Title:First Law}]}
Run Code Online (Sandbox Code Playgroud)

注意:上面的空格在线上编码%20.

您可以通过以下方式访问您的服务:

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