Переопределение десериализации имени Поля в ServiceStack


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

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

2 22

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 .

JsConfig.EmitLowercaseUnderscoreNames = true; 
Но, по моему опыту, десериализация потерпела бы неудачу, так как она ожидала бы верблюжьих ценностей. Чтобы включить десериализацию значения подчеркивания json, необходимо задать свойство Jsconfig.
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);
    }
}