4

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

谢谢你的帮助!

4

1 回答 1

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;

您可以使用objectwhich 将对象视为字符串字典。

否则动态不应该出现在 DTO 上,因为它对于服务的期望没有意义。您可以将其添加到 QueryString。您可以使用JSV 格式在 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>();
}
于 2013-03-20T16:52:37.953 回答