using Newtonsoft.Json.Serialization;
public static void Main()
""AttributeString"": ""ok"",
""AttributeNumeric"": 123.45
Console.WriteLine("----- Original JSON ---");
json = JsonHelper.ConvertJson(json, new SnakeCaseNamingStrategy());
Console.WriteLine("----- Converted to snake_case ---");
json = JsonHelper.ConvertJson(json, new ProperCaseFromSnakeCaseNamingStrategy());
Console.WriteLine("----- Converted back to UpperCamelCase ---");
public static class JsonHelper
public static string ConvertJson(string json, NamingStrategy strategy, Formatting formatting = Formatting.Indented)
using (StringReader sr = new StringReader(json))
using (StringWriter sw = new StringWriter())
ConvertJson(sr, sw, strategy, formatting);
public static void ConvertJson(TextReader textReader, TextWriter textWriter, NamingStrategy strategy, Formatting formatting = Formatting.Indented)
using (JsonReader reader = new JsonTextReader(textReader))
using (JsonWriter writer = new JsonTextWriter(textWriter))
writer.Formatting = formatting;
if (reader.TokenType == JsonToken.None)
ConvertJsonValue(reader, writer, strategy);
private static void ConvertJsonValue(JsonReader reader, JsonWriter writer, NamingStrategy strategy)
if (reader.TokenType == JsonToken.StartObject)
writer.WriteStartObject();
while (reader.Read() && reader.TokenType != JsonToken.EndObject)
string name = strategy.GetPropertyName((string)reader.Value, false);
writer.WritePropertyName(name);
ConvertJsonValue(reader, writer, strategy);
else if (reader.TokenType == JsonToken.StartArray)
writer.WriteStartArray();
while (reader.Read() && reader.TokenType != JsonToken.EndArray)
ConvertJsonValue(reader, writer, strategy);
else if (reader.TokenType == JsonToken.Integer)
writer.WriteValue(Convert.ToString((long)reader.Value));
else if (reader.TokenType == JsonToken.Float)
writer.WriteValue(Convert.ToString((double)reader.Value, System.Globalization.CultureInfo.InvariantCulture));
writer.WriteValue(reader.Value);
public class ProperCaseFromSnakeCaseNamingStrategy : NamingStrategy
protected override string ResolvePropertyName(string name)
StringBuilder sb = new StringBuilder(name.Length);
for (int i = 0; i < name.Length; i++)
if (i == 0 || name[i - 1] == '_')
public abstract class NamingStrategy
public string GetPropertyName(string name, bool isSpecified)
if (isSpecified) return name;
return ResolvePropertyName(name);
protected abstract string ResolvePropertyName(string name);
public class SnakeCaseNamingStrategy : NamingStrategy
private static readonly Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy innerStrategy = new Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy();
protected override string ResolvePropertyName(string name)
return innerStrategy.GetPropertyName(name, false);