Переопределение десериализации имени Поля в ServiceStack
Я использую ServiceStack для десериализации некоторых значений HTML-формы, но не могу понять, как переопределить значение, из которого должно быть прочитано каждое поле.
Например, форма передает значение first_name
, но свойство в моем POCO называется FirstName
. как бы я сделал такое отображение в ServiceStack
2 ответа:
Сериализаторы текста ServiceStack поддерживают псевдонимы [DataMember], где можно использовать параметр Name для указания псевдонима каждого поля, например:
[DataContract] public class Customer { [DataMember(Name="first_name")] public string FirstName { get; set; } [DataMember(Name="last_name")] public string LastName { get; set; } }
Примечание: как только вы добавляете атрибуты [DataContract] / [DataMember] к вашим DTOs, то поведение становится опционным, и вы должны будете добавить [DataMember] к каждому из свойств, которые вы хотите сериализовать.
Испускание идиоматического JSON для всех DTOs
Вы можете проинструктировать сериализацию JSON следовать другому соглашению путем задание следующих глобальных параметров:
//Emit {"firstName":"first","lastName":"last"} JsConfig.EmitCamelCaseNames = true; //Emit {"first_name":"first","last_name":"last"} JsConfig. EmitLowercaseUnderscoreNames = true;
Чтобы сериализовать класс C# с помощью соглашения подчеркивания, необходимо установить JsConfig.EmitLowercaseUnderscoreNames к true, как сказал mythz .
Но, по моему опыту, десериализация потерпела бы неудачу, так как она ожидала бы верблюжьих ценностей. Чтобы включить десериализацию значения подчеркивания json, необходимо задать свойство Jsconfig.JsConfig.EmitLowercaseUnderscoreNames = true;
JsConfig.PropertyConvention = PropertyConvention.Lenient;
Я использую простой вспомогательный метод для решения проблемы сериализации и десериализации.
public static class JsonHelpers { public static string ToUnderscoredJson<T>(this T obj) { JsConfig.EmitLowercaseUnderscoreNames = true; return JsConfig.PreferInterfaces ? JsonSerializer.SerializeToString(obj, AssemblyUtils.MainInterface<T>()) : JsonSerializer.SerializeToString(obj); } public static T FromUnderscoredJson<T>(this string json) { JsConfig.PropertyConvention = PropertyConvention.Lenient; return JsonSerializer.DeserializeFromString<T>(json); } }