SnakeCaseNamingPolicy (listed) 12.05.2023 14:10:37 (26 lines) [Edit] [Raw] [View]

using System.Text.Json;

public class SnakeCaseNamingPolicy : JsonNamingPolicy {

public static SnakeCaseNamingPolicy Instance { get; } = new();

public override string ConvertName(string name) => 
    ConvertToSnakeCase(name);

public static string ConvertToSnakeCase(string name) {
    return string.Concat(name.Select((c, i) => {
        if (i < 1)
            return c.ToString();
        var pc = name[i - 1];
        var nc = i + 1 >= name.Length ? '?' : name[i + 1]; 
        if (pc == '_') //Property name already contains underscore
            return c.ToString();
        if (char.IsUpper(c) && !(char.IsNumber(pc) && char.IsNumber(nc))) 
            return $"_{c}";
        if (char.IsNumber(c) && !char.IsNumber(pc) && !char.IsUpper(pc))
            return $"_{c}";
        return c.ToString();
    })).ToLower();
}

}