如何禁用Nancy's JSON到c#类的自动大小写转换为Dictionary

本文关键字:转换 大小写 Dictionary string Nancy 何禁用 JSON | 更新日期: 2023-09-27 18:15:41

对于c# JavaScript中表示字典的对象,在对JSON进行序列化和反序列化期间,Nancy如何禁用驼峰和帕斯卡大小写之间的自动转换?

在我的例子中,这些字典的键是不能通过自动大小写转换更改的id。

此外,这些字典本身是其他对象的属性名/键的值。

这里是一个示例JavaScript对象,其中我想要对象的自动大小写转换(.customers.Customers.addresses.Addresses),但不用于ID-value子对象的键(ID33100a00, abc433D123等):

{
    customers: {
        ID33100a00: 'Percy',
        abc433D123: 'Nancy'
    },
    addresses: {
        abc12kkhID: 'Somewhere over the rainbow',
        JGHBj45nkc: 'Programmer''s hell',
        jaf44vJJcn: 'Desert'
    }
}

这些字典对象都用c#中的Dictionary<string, T>表示,例如:

Dictionary<string, Customer> Customers;
Dictionary<string, Address> Addresses;

不幸的设置

JsonSettings.RetainCasing = true;

将不会导致任何自动大小写转换。

我也试图通过写我自己的JavaScriptConverter来解决这个问题正如南希文档中所描述的,但是实际的对字符串的序列化/反序列化因为对象的键值发生在其他地方(因为转换器不直接处理JSON字符串,但IDictionary<string, object>对象)。

我在这里读到一个相关的"bug"(或行为)

如何禁用Nancy's JSON到c#类的自动大小写转换为Dictionary<string, & >

在我们的项目中,我们通常依赖Newtonsoft。Json来满足我们的序列化需求。如何获得正确的大小写,是通过创建一个继承JsonSerializer的新类,如下所示:

public sealed class CustomJsonSerializer : JsonSerializer
{
    public CustomJsonSerializer()
    {    
        ContractResolver = new CamelCasePropertyNamesContractResolver();
    }
}

然后像这样在应用程序中注册它:

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

它还允许您自定义序列化的其他位,例如将枚举序列化为字符串:

public CustomJsonSerializer()
{
    Converters.Add(new StringEnumConverter());
    ContractResolver = new CamelCasePropertyNamesContractResolver();
}