src/Elastic.CommonSchema/Serialization/SnakeCaseJsonNamingPolicy.cs (35 lines of code) (raw):

// Licensed to Elasticsearch B.V under one or more agreements. // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information using System.Text; using System.Text.Json; namespace Elastic.CommonSchema.Serialization { internal class SnakeCaseJsonNamingPolicy : JsonNamingPolicy { public static string ToSnakeCase(string s) { if (string.IsNullOrEmpty(s)) return s; var sb = new StringBuilder(); for (var i = 0; i < s.Length; i++) { var c = s[i]; if (!char.IsUpper(c)) { sb.Append(c); continue; } // first if (i == 0) sb.Append(char.ToLowerInvariant(c)); else if (char.IsUpper(s[i - 1])) // WriteIO => write_io sb.Append(char.ToLowerInvariant(c)); else if (s[i - 1] == '_') // User_Id => user_id sb.Append(char.ToLowerInvariant(c)); else { sb.Append("_"); sb.Append(char.ToLowerInvariant(c)); } } return sb.ToString(); } public override string ConvertName(string name) => ToSnakeCase(name); } }