.net确保json键是小写的

大家好,在.Net中使用json的简单方法是确保按键以小写forms发送。

目前我正在使用newtonsoft.json库并简单地使用

string loginRequest = JsonConvert.SerializeObject(auth);

在这种情况下,auth只是以下对象

 public class Authority { public string Username { get; set; } public string ApiToken { get; set; } } 

这导致

 {"Username":"Mark","ApiToken":"xyzABC1234"} 

有没有确保用户名和apitoken键通过小写?

我不想简单地通过string.tolower()运行它,当然,因为用户名&apitoken的值是混合大小写。

我意识到我可以编程这样做,并手动创buildjsonstring,但我需要约20左右的json数据string,看看我是否可以节省自己一些时间。 想知道是否有任何已经build立的库,允许你强制执行小写键创build。

您可以为此创build自定义合约parsing程序。 以下合约parsing器将所有密钥转换为小写:

 public class LowercaseContractResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { return propertyName.ToLower(); } } 

用法:

 var settings = new JsonSerializerSettings(); settings.ContractResolver = new LowercaseContractResolver(); var json = JsonConvert.SerializeObject(authority, Formatting.Indented, settings); 

Wil导致:

 {"username":"Mark","apitoken":"xyzABC1234"} 

如果您总是想使用LowercaseContractResolver序列化,请考虑将其封装到类中以避免重复:

 public class LowercaseJsonSerializer { private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings { ContractResolver = new LowercaseContractResolver() }; public static string SerializeObject(object o) { return JsonConvert.SerializeObject(o, Formatting.Indented, Settings); } public class LowercaseContractResolver : DefaultContractResolver { protected override string ResolvePropertyName(string propertyName) { return propertyName.ToLower(); } } } 

可以这样使用:

 var json = LowercaseJsonSerializer.SerializeObject(new { Foo = "bar" }); // { "foo": "bar" } 

ASP.NET MVC4 / WebAPI

如果您正在使用ASP.NET MVC4 / WebAPI,则可以使用默认包含的Newtonsoft.Json库中的CamelCasePropertyNamesContractResolver

 protected void Application_Start() { JsonConfig.Configure(); } public static class JsonConfig { public static void Configure(){ var formatters = GlobalConfiguration.Configuration.Formatters; var jsonFormatter = formatters.JsonFormatter; var settings = jsonFormatter.SerializerSettings; settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); } }