Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ensuring json keys are lowercase in .NET

Is there simple way using JSON in .NET to ensure that the keys are sent as lower case?

At the moment I'm using the newtonsoft's Json.NET library and simply using

string loginRequest = JsonConvert.SerializeObject(auth); 

In this case auth is just the following object

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

This results in

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

Is there a way to ensure that the username and apitoken keys come through as lowercase?

I don't want to simply run it through String.ToLower() of course because the values for username and apitoken are mixed case.

I realise I can programatically do this and create the JSON string manually, but I need this for approx 20 or so JSON data strings and I'm seeing if I can save myself some time. I'm wondering if there are any already built libraries that allow you to enforce lowercase for key creation.

like image 972
Mark Avatar asked Jun 09 '11 05:06

Mark


People also ask

Should JSON properties be LowerCase?

property names must start with lower case letter. Dictionary must be serialized into jsonp where keys will be used for property names. LowerCase rule does not apply for dictionary keys.

What is deserialize JSON in C#?

Deserialization. In Deserialization, it does the opposite of Serialization which means it converts JSON string to custom . Net object. In the following code, it calls the static method DeserializeObject() of the JsonConvert class by passing JSON data. It returns a custom object (BlogSites) from JSON data.

What is CamelCaseNamingStrategy?

Description. CamelCaseNamingStrategy() Initializes a new instance of the CamelCaseNamingStrategy class. CamelCaseNamingStrategy(Boolean, Boolean) Initializes a new instance of the CamelCaseNamingStrategy class.


1 Answers

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.

like image 175
alexn Avatar answered Sep 17 '22 16:09

alexn