gpt4 book ai didi

请求 DTO 中的 ServiceStack 和动态属性

转载 作者:行者123 更新时间:2023-12-05 01:09:40 24 4
gpt4 key购买 nike

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

谢谢你的帮助!

最佳答案

NuGet 上 ServiceStack 的 .NET 3.5 库版本没有对 .NET 4.0+ 的 native 支持 动态类型。您可以将 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>();
}

关于请求 DTO 中的 ServiceStack 和动态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15529289/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com