Ensuring json keys are lowercase in .NET Ensuring json keys are lowercase in .NET json json

Ensuring json keys are lowercase in .NET


You can create a custom contract resolver for this. The following contract resolver will convert all keys to lowercase:

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

Usage:

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

Wil result in:

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

If you always want to serialize using the LowercaseContractResolver, consider wrapping it in a class to avoid repeating yourself:

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();        }    }}

Which can be used like this:

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

ASP.NET MVC4 / WebAPI

If you are using ASP.NET MVC4 / WebAPI, you can use a CamelCasePropertyNamesContractResolver from Newtonsoft.Json library which included by default.


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();    }}


In Json.NET 9.0.1 and later it is possible to ensure that all property names are converted to lowercase by using a custom NamingStrategy. This class extracts the logic for algorithmic remapping of property names from the contract resolver to a separate, lightweight object that can be set on DefaultContractResolver.NamingStrategy.Doing so avoids the need to create a custom ContractResolver and thus may be easier to integrate into frameworks that already have their own contract resolvers.

Define LowercaseNamingStrategy as follows:

public class LowercaseNamingStrategy : NamingStrategy{    protected override string ResolvePropertyName(string name)    {        return name.ToLowerInvariant();    }}

Then serialize as follows:

var settings = new JsonSerializerSettings{    ContractResolver = new DefaultContractResolver { NamingStrategy = new LowercaseNamingStrategy() },};string loginRequest = JsonConvert.SerializeObject(auth, settings);

Notes -