当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
相关产品推荐
相关产品推荐

