C#如何获取dynamic动态对象第n个属性名并替换null为空字符串
问题原因
你用dynamic接收的反序列化对象实际是Newtonsoft.Json.Linq.JObject类型。直接调用GetType().GetProperties()是通过反射获取.NET运行时类型的原生实例成员,返回的自然是JToken、JObject类自带的属性(如Parent、First、Count等),和JSON结构里的业务字段没有关系。
实现方案
Newtonsoft.Json内置了专门操作JSON结构的API,不需要使用反射,直接就能枚举业务字段、完成null值替换:
- 将dynamic对象显式转换为JObject类型
- 调用
Properties()方法即可枚举所有JSON业务属性,每个属性的Name对应字段名,Value对应字段值 - 遍历属性时,将值类型为
JTokenType.Null的字段值替换为空字符串即可
完整代码:
JObject x = (JObject)data.elements[i]; // 调用ToList()缓存属性集合,避免遍历中修改值触发枚举异常 foreach (JProperty prop in x.Properties().ToList()) { if (prop.Value.Type == JTokenType.Null) { prop.Value = ""; } } // 如需获取第n个业务属性的名称,按索引取值即可,索引从0开始 // 例:获取示例中第3个属性order_Date的名称 string propName = x.Properties().ElementAt(2).Name;
其他可选方案
如果你的JSON结构固定,也可以直接反序列化为对应的强类型C#类,遍历类中字符串类型的属性,将null值赋值为空字符串即可。但对于结构动态的JSON场景,直接操作JObject是最轻量、性能最优的方案,不需要额外编写类型映射逻辑。
内容的提问来源于stack exchange,提问作者KWallace
相关产品推荐
相关产品推荐

