ServiceStack и динамические свойства в запросах DTOs
Я хотел бы разместить объект JSON в моем сервисе стека служб и использовать динамическое свойство в запросе DTO. Все подходы, которые я пробовал до сих пор, оставляют объект с нулевым значением.
Код 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; }
}
Я также попытался использовать объект и JsonObject вместо dynamic в DTO.
Чтобы быть полным, вот сервис тоже:
public class HelloService : Service
{
public object Any(Hello request)
{
return new HelloResponse { Result = "Hello, " + request.Name };
}
}
Мерфи проходит через свойство Name без каких-либо проблемы, но свойство законов остается нулевым.
В конце концов, я хочу как-то повторить (используя отражение?) над свойством законов и получить все содержащиеся свойства и значения.
Я не могу использовать типизированный DTO здесь, потому что я не знаю JSON свойства законов во время разработки (и он может меняться довольно часто).
Спасибо за любую помощь!
1 ответ:
На .Net 3.5 с библиотека построения ServiceStack на NuGet не имеет встроенной поддержки .Net версии 4.0+ динамической тип. Вы можете передать JSON в СВОЙСТВОstring и динамически проанализировать его на сервере:
public object Any(Hello request) { var laws = JsonObject.Parse(request.Laws); laws["SomeProp"] // laws.ArrayObjects("SomeArr") // }В противном случае вы можете использовать
Dictionary<string,string>или указать в вашем AppHost:JsConfig.ConvertObjectTypesIntoStringDictionary = true;Можно использовать
object, который будет обрабатывать объекты как словарь строк.В противном случае dynamic не должен быть на DTO, поскольку это бессмысленно относительно того, что ожидает служба. Вы можете просто добавить его в строку запроса. Вы можете использовать формат JSV для указания сложных графов объектов в строке запроса, например:
Примечание: пробелы выше кодируются с помощью/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>(); }