Отменить десериализацию имени поля в ServiceStack
Я использую ServiceStack для десериализации некоторых значений формы HTML, но не могу понять, как переопределить значение, из которого должно считываться каждое поле.
Например, форма отправляет значение в first_name
, но свойство на моем POCO называется FirstName
. как бы я мог сделать сопоставление в ServiceStack
Ответы
Ответ 1
Сериализаторы ServiceStack Text поддерживают псевдонимы [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] в свои DTO, поведение станет отключенным, и вы добавите [DataMember] для каждого из свойств, которые вы хотите сериализовать.
Испускание идиоматического JSON для всех DTOs
Вы можете проинструктировать сериализацию JSON в соответствии с другим соглашением, указав следующие глобальные параметры:
//Emit {"firstName":"first","lastName":"last"}
JsConfig.EmitCamelCaseNames = true;
//Emit {"first_name":"first","last_name":"last"}
JsConfig. EmitLowercaseUnderscoreNames = true;
Ответ 2
Чтобы сериализовать класс С# с соглашением подчеркивания, вам нужно установить JsConfig.EmitLowercaseUnderscoreNames в true, как указано mythz.
JsConfig.EmitLowercaseUnderscoreNames = true;
Но, по моему опыту, Deserialising терпит неудачу, поскольку он ожидает ценности CamelCased. Чтобы включить десериализацию значения дескриптора json, вы должны установить JsConfig PropertyConvention.
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);
}
}