首页 > 解决方案 > Nancy 2.0.0 中的控制反序列化

问题描述

我如何指示Nancy 2.0.0 -clinteastwoodDateTime从这个 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像这样实现反序列化覆盖

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 的方式进行更新。

标签: c#nancyjson-deserialization

解决方案


就像在之前的 1.x 版本中一样,您可以使用自定义JsonSerializer来指导 Nancy 进行一般的序列化/反序列化调整:

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

并将其注册到JsonSerializer您的容器中,例如在NancyBootStrapper's中ConfigureApplicationContainer是这样的:

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

我的问题是我错过了包含Nancy.Serialization.JsonNetNuGet 包,这是这个特定项目工作所必需的。


推荐阅读