You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当JSON属性未知时,如何创建C#模型?

问题:C#中处理动态属性名的JSON反序列化

API返回的JSON结构里,data字段是一个对象,其属性名是随机生成的taskID(每次请求都不一样),属性值是对应的任务信息。返回的JSON示例如下:

{
    "result": true,
    "data": {
        "6688288": {
            "taskId": 6688288,
            "owner": "Vader"
        },
        "6798986": {
            "taskId": 6798986,
            "owner": "Palpatine"
        },
        "6688269": {
            "taskId": 6688269,
            "owner": "Tarkin"
        }
    }
}

之前尝试的模型因为硬编码了固定的taskID属性,完全无法适配动态场景,代码如下:

public class Root
{
    public bool result { get; set; }
    public Data data { get; set; }
}

public class Data
{
    [JsonProperty("6688288")]
    public _6688288 _6688288 { get; set; }

    [JsonProperty("6798986")]
    public _6798986 _6798986 { get; set; }

    [JsonProperty("6688269")]
    public _6688269 _6688269 { get; set; }
}

public class _6688288
{
    public int taskId { get; set; }
    public string owner { get; set; }
}

public class _6798986
{
    public int taskId { get; set; }
    public string owner { get; set; }
}

public class _6688269
{
    public int taskId { get; set; }
    public string owner { get; set; }
}

目标是把这些动态属性对应的任务信息转换成List<myTask>,期望的task模型为:

public class myTask
{
    public int taskId { get; set; }
    public string owner { get; set; }
}

两种高效解决方案

方案1:用Dictionary替代固定类(强类型反序列化)

直接把Root类中的data字段定义为Dictionary<int, myTask>(或者Dictionary<string, myTask>,Json.NET会自动转换键的类型),这样就能直接反序列化所有动态属性:

public class Root
{
    public bool result { get; set; }
    public Dictionary<int, myTask> data { get; set; }
}

public class myTask
{
    public int taskId { get; set; }
    public string owner { get; set; }
}

反序列化后,直接取字典的Values转成列表即可:

var root = JsonConvert.DeserializeObject<Root>(jsonString);
List<myTask> taskList = root.data.Values.ToList();

方案2:用JObject手动解析(灵活无模型)

如果不想定义Root类,或者需要更灵活的处理,可以用Json.NET的JObject直接解析JSON:

// 解析JSON字符串
var jObject = JObject.Parse(jsonString);
// 获取data对应的JObject
var dataJObject = jObject["data"] as JObject;
// 遍历所有属性,转成myTask并收集为列表
List<myTask> taskList = dataJObject.Properties()
    .Select(prop => prop.Value.ToObject<myTask>())
    .ToList();

这两种方法都能完美处理动态属性名的场景,方案1更简洁,适合长期复用;方案2更灵活,适合临时处理或不需要完整Root模型的场景。

内容的提问来源于stack exchange,提问作者cmill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:43:18