|
11 | 11 | using System.Runtime.Serialization;
|
12 | 12 | using System.Security.Cryptography;
|
13 | 13 | using System.Text;
|
| 14 | +using System.Text.RegularExpressions; |
14 | 15 | using System.Xml.Serialization;
|
15 | 16 |
|
16 | 17 | #pragma warning disable IDE0063 // Use simple 'using' statement
|
@@ -3064,6 +3065,15 @@ private static bool EqualsIgnoreCase(this string str, string text, bool trim = f
|
3064 | 3065 | return string.Compare(str, text, StringComparison.OrdinalIgnoreCase) == 0 || /*Recover from different casing (Snake_Case to CamelCase)*/ string.Compare(str, text.Replace("_", ""), StringComparison.OrdinalIgnoreCase) == 0;
|
3065 | 3066 | }
|
3066 | 3067 |
|
| 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 | + |
3067 | 3077 | private static string Nullify(this string str)
|
3068 | 3078 | {
|
3069 | 3079 | if (str == null)
|
@@ -3274,14 +3284,15 @@ public void WriteValues(TextWriter writer, object component, IDictionary<object,
|
3274 | 3284 | }
|
3275 | 3285 | else
|
3276 | 3286 | {
|
| 3287 | + string nameToWrite = options.SerializationOptions.HasFlag(JsonSerializationOptions.ConvertToSnakeCase) ? ConvertToSnakeCase(member.EscapedWireName) : member.EscapedWireName; ; |
3277 | 3288 | if (options.SerializationOptions.HasFlag(JsonSerializationOptions.WriteKeysWithoutQuotes))
|
3278 | 3289 | {
|
3279 |
| - writer.Write(member.EscapedWireName); |
| 3290 | + writer.Write(nameToWrite); |
3280 | 3291 | }
|
3281 | 3292 | else
|
3282 | 3293 | {
|
3283 | 3294 | writer.Write('"');
|
3284 |
| - writer.Write(member.EscapedWireName); |
| 3295 | + writer.Write(nameToWrite); |
3285 | 3296 | writer.Write('"');
|
3286 | 3297 | }
|
3287 | 3298 |
|
@@ -5498,10 +5509,15 @@ public enum JsonSerializationOptions
|
5498 | 5509 | /// </summary>
|
5499 | 5510 | SkipGetOnly = 0x800000,
|
5500 | 5511 |
|
| 5512 | + /// <summary> |
| 5513 | + /// Convert field names to snake case. |
| 5514 | + /// </summary> |
| 5515 | + ConvertToSnakeCase = 0x1000000, |
| 5516 | + |
5501 | 5517 | /// <summary>
|
5502 | 5518 | /// The default value.
|
5503 | 5519 | /// </summary>
|
5504 |
| - Default = UseXmlIgnore | UseScriptIgnore | SerializeFields | AutoParseDateTime | UseJsonAttribute | SkipGetOnly | SkipNullPropertyValues | SkipNullDateTimeValues, |
| 5520 | + Default = UseXmlIgnore | UseScriptIgnore | SerializeFields | AutoParseDateTime | UseJsonAttribute | SkipGetOnly | SkipNullPropertyValues | SkipNullDateTimeValues | ConvertToSnakeCase, |
5505 | 5521 | }
|
5506 | 5522 |
|
5507 | 5523 | /// <summary>
|
|
0 commit comments