Управление десериализацией в Nancy 2.0.0

Как указать Нэнси 2.0.0-clinteastwood выполнить пользовательскую десериализацию в DateTime, например из этого json

{
    "someDate": "2018-09-18"
}

в свойство DateTime, например, в экземпляре этого класса C#

public class SomeClass
{
    public DateTime SomeDate { get; set; }
}

?

В версиях до 2.0.0 вы могли очевидно назначить свой пользовательский JavaScriptPrimitiveConverter вызовом статического JsonSettings, например, в ApplicationStartup, например это

Nancy.Json.JsonSettings.PrimitiveConverters.Add(new CustomJavaScriptPrimitiveConverter())

и я мог бы реализовать переопределение JavaScriptPrimitiveConverter Deserialize, например, вот так

public override object Deserialize(object primitiveValue, Type type, JavaScriptSerializer serializer)
{
    if (type == typeof(DateTime))
    {
        if (primitiveValue is string dateString
            && DateTime.TryParseExact(dateString, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var dateTime))
        {
            return dateTime;
        }
    }

    return null;
}

Однако статический класс JsonSettings, похоже, недоступен в версии 2.0.0.

Из поиска мне кажется, что есть некоторые функции SimpleJson, которые можно использовать для достижения этой цели, но я не могу найти никаких примеров, и любая документация, которую я нахожу, похоже, не обновляется с помощью способа 2.0.0.


person Ulf Åkerstedt    schedule 18.09.2018    source источник


Ответы (2)


Как и в предыдущих версиях 1.x, вы можете использовать пользовательский JsonSerializer, чтобы проинструктировать Нэнси об общих настройках сериализации/десериализации:

public sealed class CustomJsonSerializer : JsonSerializer
{
    public CustomJsonSerializer()
    {
        DateFormatString = "yyyy-MM-dd";
        // ... other formatting stuff ...
    }
}

И зарегистрируйте этот JsonSerializer у себя в контейнере, например, в ConfigureApplicationContainer NancyBootStrapper вот так:

protected override void ConfigureApplicationContainer(TinyIoCContainer container)
{
    base.ConfigureApplicationContainer(container);
    container.Register<JsonSerializer, CustomJsonSerializer>();
    // ... other container setup ...
}

Моя проблема заключалась в том, что я пропустил включение пакета Nancy.Serialization.JsonNet NuGet, который необходим для того, чтобы это работало, для этого конкретного проекта.

person Ulf Åkerstedt    schedule 20.09.2018

Вопрос о регистрации PrimitiveConverter, но ответ выглядит как регистрация JsonSerializer.

Я смог зарегистрировать PrimitiveConverter, выполнив это в Global.Application_Start с Нэнси 2.0.0:

protected void Application_Start(object sender, EventArgs e)
{
    Nancy.Json.JsonConfiguration.Default.PrimitiveConverters.Add(new CustomJavaScriptPrimitiveConverter());
}
person Nivin    schedule 17.11.2020