如何禁用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"(或行为)
在我们的项目中,我们通常依赖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();
}