Подтвердить что ты не робот

Отменить десериализацию имени поля в ServiceStack

Я использую ServiceStack для десериализации некоторых значений формы HTML, но не могу понять, как переопределить значение, из которого должно считываться каждое поле.

Например, форма отправляет значение в first_name, но свойство на моем POCO называется FirstName. как бы я мог сделать сопоставление в ServiceStack

4b9b3361

Ответ 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);
    }
}