C#如何将JSON属性值(非键名)转换为小写 - 反序列化场景
C# JSON 所有字符串属性值转小写实现方案
现有代码问题
- 仅覆盖
JObject类型节点处理逻辑,未适配JArray数组类型,无法遍历数组内的元素、嵌套对象 - 仅对属性名执行了小写转换,未对字符串类型的属性值做任何处理
- 递归分支不全,嵌套数组、多层级结构下的字符串值会被遗漏
正确实现代码
基于Json.NET(Newtonsoft.Json)实现通用递归逻辑,覆盖对象、数组、值三类节点,仅对字符串类型的值做小写转换,不改动其他类型值、不改动属性名:
using Newtonsoft.Json.Linq; /// <summary> /// 递归将JSON结构中所有字符串类型值转换为小写 /// </summary> /// <param name="token">待处理的JToken节点</param> private static void ConvertStringValuesToLower(JToken token) { switch (token.Type) { case JTokenType.Object: // 遍历对象下所有属性,递归处理属性值 foreach (JProperty property in token.Children<JProperty>().ToList()) { ConvertStringValuesToLower(property.Value); } break; case JTokenType.Array: // 遍历数组下所有元素,递归处理每个元素 foreach (JToken item in token.Children().ToList()) { ConvertStringValuesToLower(item); } break; case JTokenType.String: // 字符串类型节点直接替换为小写值 token.Replace(new JValue(token.Value<string>().ToLower())); break; // 数字、布尔、null、日期等非字符串类型不做处理 default: break; } }
调用方式
加载JSON后直接传入根节点调用即可:
// 从字符串/文件加载JSON结构 JObject rootJson = JObject.Parse(File.ReadAllText("你的JSON文件路径.json")); // 执行转换 ConvertStringValuesToLower(rootJson); // 获取转换后的JSON字符串 string convertedJson = rootJson.ToString();
转换效果
转换后将完全匹配预期,示例片段输出如下:
"name": "luke skywalker", "hair_color": "blond", "skin_color": "fair", "birth_year": "19bby", "gender": "male", "films": [ "https://swapi.dev/api/films/1/", "https://swapi.dev/api/films/2/", "https://swapi.dev/api/films/3/", "https://swapi.dev/api/films/6/" ]
补充说明
- 如果需要同时将属性名转换为小写,在
JTokenType.Object分支的循环内添加属性替换逻辑即可,仅转值时无需修改属性名 - 所有非字符串类型值(如示例中的
count: 82数字、previous: null空值)会保持原有类型和值,不会出现转换错误 - 支持任意层级的对象、数组嵌套,不会遗漏深层的字符串值
内容的提问来源于stack exchange,提问作者User456
相关产品推荐
相关产品推荐

