You need to enable JavaScript to run this app. 如何从NewtonSoft.Json.Linq.JObject中获取所有属性及对应类型
优惠活动
大模型
产品
解决方案
定价
更多

如何从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转为标准的动态对象处理:

  1. 反序列化时添加配置:
var deserializeSettings = new JsonSerializerSettings
{
    Converters = new List<JsonConverter> { new ExpandoObjectConverter() }
};
// 反序列化时传入配置
var instance = JsonConvert.DeserializeObject<Instance>(你的JSON字符串, deserializeSettings);
  1. 遍历属性逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 07:27:02