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>(); }