如何从NewtonSoft.Json.Linq.JObject中获取所有属性及对应类型
问题解决方法
根因说明
你原来的反射方案失效是因为反序列化后Model实际为Newtonsoft.Json.Linq.JObject类型,GetType().GetProperties()返回的是JObject类本身的.NET属性,而非JSON映射得到的动态业务属性。
可选方案
方案1:直接遍历JObject属性(无需修改现有反序列化逻辑)
直接利用JObject自带的属性遍历API即可拿到所有动态属性和对应类型,代码示例:
if (Model is Newtonsoft.Json.Linq.JObject jObj) { // 遍历JObject的所有动态属性 foreach (var jProp in jObj.Properties()) { // 获取属性名 string propertyName = jProp.Name; // 获取属性的JSON类型,可直接映射为C#基础类型做校验 Newtonsoft.Json.Linq.JTokenType jsonType = jProp.Value.Type; // 也可以直接转换为对应C#类型的值 object propertyValue = jProp.Value.ToObject<object>(); // 此处添加你的类型校验、EditForm表单项生成逻辑即可 // 例:jsonType == JTokenType.Boolean 生成复选框,jsonType == JTokenType.String 生成文本输入框 } }
方案2:反序列化为ExpandoObject(兼容通用动态对象处理逻辑)
如果你不想依赖Newtonsoft.Json的JObject类型,可以在反序列化时指定转换器,将Model转为标准的动态对象处理:
- 反序列化时添加配置:
var deserializeSettings = new JsonSerializerSettings { Converters = new List<JsonConverter> { new ExpandoObjectConverter() } }; // 反序列化时传入配置 var instance = JsonConvert.DeserializeObject<Instance>(你的JSON字符串, deserializeSettings);
- 遍历属性逻辑:
if (Model is ExpandoObject expandoModel) { // ExpandoObject可直接转为字典遍历所有属性 var propertyDict = (IDictionary<string, object>)expandoModel; foreach (var (propName, propValue) in propertyDict) { Type propType = propValue?.GetType(); // 后续类型校验、表单生成逻辑 } }
注意事项
- JTokenType枚举已经覆盖了所有常用JSON类型,包括字符串、数值、布尔、数组、嵌套对象等,完全可以满足生成表单的类型判断需求。
- JObject本身支持通过索引器直接读写属性值,后续如果需要保存表单修改结果,直接操作
jObj[属性名] = 新值即可,无需额外转换。
内容的提问来源于stack exchange,提问作者user15394380
相关产品推荐
相关产品推荐

