using System.Text.RegularExpressions;
using Newtonsoft.Json.Serialization;
public static void Main()
""ab_cd_ef"": ""ab_cd_ef""
DefaultContractResolver contractResolver = new DefaultContractResolver
NamingStrategy = new SnakeCaseWithNumberNamingStrategy(),
Welcome4 model = JsonConvert.DeserializeObject<Welcome4>(json, new JsonSerializerSettings { ContractResolver = contractResolver });
Console.WriteLine(model.Part1);
Console.WriteLine(model.Part2);
Console.WriteLine(model.Part3);
public partial class Welcome4
public string Part1 { get; set; }
public string Part2 { get; set; }
public string Part3 { get; set; }
public int TotalNum { get; set; }
public string AbCdEf{ get; set; }
public class SnakeCaseWithNumberNamingStrategy : SnakeCaseNamingStrategy
private readonly Regex regex = new Regex(@"(?<=[A-Za-z])(?=\d)|(?<=\d)(?=[A-Za-z])");
private readonly char separator = '_';
public SnakeCaseWithNumberNamingStrategy(bool processDictionaryKeys, bool overrideSpecifiedNames)
: base(processDictionaryKeys, overrideSpecifiedNames)
ProcessDictionaryKeys = processDictionaryKeys;
OverrideSpecifiedNames = overrideSpecifiedNames;
public SnakeCaseWithNumberNamingStrategy(bool processDictionaryKeys, bool overrideSpecifiedNames, bool processExtensionDataNames) : this(processDictionaryKeys, overrideSpecifiedNames)
ProcessExtensionDataNames = processExtensionDataNames;
public SnakeCaseWithNumberNamingStrategy()
protected override string ResolvePropertyName(string name)
return ResolvePropertyNameWithNumber(base.ResolvePropertyName(name));
private string ResolvePropertyNameWithNumber(string name)
string formattedName = regex.Replace(name, separator.ToString());