我想将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(它可以经常更改)。
感谢您的帮助!
答案 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>();
}