对于在C#和 JavaScript中表示字典的对象,Nancy在序列化和反序列化JSON期间的自动转换如何被禁用?


在我的情况下,这些词典的键是不能通过自动大小写转换来更改的ID。


此外,这些词典本身是其他对象属性的值名称/键。
&#xA;&#xA;这是一个示例JavaScript对象,我想要对象的自动大小写转换( .customers < / code>到
.Customers
和 .addresses
到 .Addresses
),但不用于ID值子对象的键( ID33100a00
, abc433D123
等):
{&#xA;客户:{&#xA; ID33100a00:'Percy',&#xA; abc433D123:'南希'&#xA; },&#XA;地址:{&#xA; abc12kkhID:'在彩虹的某个地方',&#xA; JGHBj45nkc:'程序员的地狱',&#xA; jaf44vJJcn:'沙漠'&#xA; }&#xA;}&#xA;
&#xA;&#xA; 这些词典对象都由 Dictionary&lt; string,T&gt;
表示C#,例如:
Dictionary&lt; string,Customer&gt;客户;&#xA;字典&lt;字符串,地址&gt;地址;&#xA;
&#xA;&#xA; 不幸的是设置
&#xA;&#xA; JsonSettings.RetainCasing = true ;&#xA;
&#xA;&#xA; 根本不会导致自动大小写转换。
&#xA;&#xA; I也尝试通过编写我自己的 JavaScriptConverter
&#xA来解决问题,如 Nancy文档,&#xA;但实际的序列化/反序列化到字符串&#xA;对象的键发生在其他地方&#xA;(因为转换器没有直接处理JSON字符串,&#xA;但 IDictionary&lt; string,object&gt;
对象)。
我读到了一个相关的“bug”(或行为)此处。
&#xA;答案 0 :(得分:3)
在我们的项目中,我们通常依赖于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();
}