如何在C#中使用Newtonsoft.Json将snake_case转为camelCase?
解决方案
要实现将snake_case格式的JSON反序列化为C#类,并且能以驼峰式(camelCase)访问d字段内的属性,你可以通过配置Newtonsoft.Json的序列化规则来实现,具体步骤如下:
1. 定义C#类
保持示例中的类结构,d字段使用dynamic类型以适配不确定的内容:
public class Example { public int op { get; set; } public string t { get; set; } public dynamic d { get; set; } }
2. 自定义命名策略
创建一个自定义的命名策略类,用于将JSON中的snake_case键转换为驼峰式的属性名:
public class SnakeToCamelCaseNamingStrategy : SnakeCaseNamingStrategy { public SnakeToCamelCaseNamingStrategy() : base(true, false) { ProcessDictionaryKeys = true; } public override string GetDeserializedPropertyName(string name) { // 先通过内置SnakeCase策略转成PascalCase,再转为camelCase var pascalCaseName = base.GetDeserializedPropertyName(name); if (string.IsNullOrEmpty(pascalCaseName)) return pascalCaseName; return char.ToLower(pascalCaseName[0]) + pascalCaseName.Substring(1); } }
3. 配置序列化设置并反序列化
使用自定义的命名策略配置JsonSerializerSettings,然后执行反序列化:
// 示例JSON字符串 var json = @" { ""op"": 0, ""t"": ""some_name"", ""d"": { ""heartbeat_interval"": 10000, ""user"": { ""user_id"": 1 } } }"; // 配置序列化设置 var serializerSettings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver { NamingStrategy = new SnakeToCamelCaseNamingStrategy() } }; // 反序列化JSON到Example类 var res = JsonConvert.DeserializeObject<Example>(json, serializerSettings); // 现在可以用驼峰式访问d内的属性 var heartbeatInterval = res.d.heartbeatInterval; // 对应JSON的heartbeat_interval var userId = res.d.user.userId; // 对应JSON的user_id
说明
- 自定义命名策略同时处理了类属性和
dynamic对象内的字典键,确保snake_case的JSON键都能转换为驼峰式访问名。 - 如果你不想自定义命名策略,也可以直接在
DefaultContractResolver中实现键转换逻辑,效果一致。
内容的提问来源于stack exchange,提问作者InvaderIzzy
相关产品推荐
相关产品推荐

