Skip to content

Commit 9ec50aa

Browse files
Erik Bylundkirre-bylund
authored andcommitted
Convert to snake case when serializing
1 parent 41501b4 commit 9ec50aa

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

Runtime/Libraries/ZeroDepJson/ZeroDepJson.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Runtime.Serialization;
1212
using System.Security.Cryptography;
1313
using System.Text;
14+
using System.Text.RegularExpressions;
1415
using System.Xml.Serialization;
1516

1617
#pragma warning disable IDE0063 // Use simple 'using' statement
@@ -3064,6 +3065,15 @@ private static bool EqualsIgnoreCase(this string str, string text, bool trim = f
30643065
return string.Compare(str, text, StringComparison.OrdinalIgnoreCase) == 0 || /*Recover from different casing (Snake_Case to CamelCase)*/ string.Compare(str, text.Replace("_", ""), StringComparison.OrdinalIgnoreCase) == 0;
30653066
}
30663067

3068+
private static string ConvertToSnakeCase(string str)
3069+
{
3070+
str = Regex.Replace(str, @"([a-z])([A-Z])", "$1_$2");
3071+
str = Regex.Replace(str, @"([a-z])([0-9])", "$1_$2");
3072+
str = Regex.Replace(str, @"([0-9])([A-Za-z])", "$1_$2");
3073+
str = Regex.Replace(str, @"([A-Z]{2,})([a-z])", "$1_$2");
3074+
return str.ToLowerInvariant();
3075+
}
3076+
30673077
private static string Nullify(this string str)
30683078
{
30693079
if (str == null)
@@ -3274,14 +3284,15 @@ public void WriteValues(TextWriter writer, object component, IDictionary<object,
32743284
}
32753285
else
32763286
{
3287+
string nameToWrite = options.SerializationOptions.HasFlag(JsonSerializationOptions.ConvertToSnakeCase) ? ConvertToSnakeCase(member.EscapedWireName) : member.EscapedWireName; ;
32773288
if (options.SerializationOptions.HasFlag(JsonSerializationOptions.WriteKeysWithoutQuotes))
32783289
{
3279-
writer.Write(member.EscapedWireName);
3290+
writer.Write(nameToWrite);
32803291
}
32813292
else
32823293
{
32833294
writer.Write('"');
3284-
writer.Write(member.EscapedWireName);
3295+
writer.Write(nameToWrite);
32853296
writer.Write('"');
32863297
}
32873298

@@ -5498,10 +5509,15 @@ public enum JsonSerializationOptions
54985509
/// </summary>
54995510
SkipGetOnly = 0x800000,
55005511

5512+
/// <summary>
5513+
/// Convert field names to snake case.
5514+
/// </summary>
5515+
ConvertToSnakeCase = 0x1000000,
5516+
55015517
/// <summary>
55025518
/// The default value.
55035519
/// </summary>
5504-
Default = UseXmlIgnore | UseScriptIgnore | SerializeFields | AutoParseDateTime | UseJsonAttribute | SkipGetOnly | SkipNullPropertyValues | SkipNullDateTimeValues,
5520+
Default = UseXmlIgnore | UseScriptIgnore | SerializeFields | AutoParseDateTime | UseJsonAttribute | SkipGetOnly | SkipNullPropertyValues | SkipNullDateTimeValues | ConvertToSnakeCase,
55055521
}
55065522

55075523
/// <summary>

0 commit comments

Comments
 (0)