使用C#查询键名动态的JSON并获取对应属性的实现方法
动态解析可变键JSON的实现方案
核心思路是利用字典类型映射动态键值对,或者直接遍历JSON节点结构,不需要为outputs下的可变键定义固定类属性。下面给出C#生态两种主流JSON库的实现方式:
方式1:强类型映射(推荐)
不需要修改整体类结构,仅需将outputs属性定义为字典类型即可:
第一步:定义实体类
// 对应outputs下的子对象结构 public class OutputValueItem { public string Value { get; set; } } // JSON根对象 public class RootJsonModel { [JsonPropertyName("@message")] // System.Text.Json用这个特性 // [JsonProperty("@message")] // Newtonsoft.Json用这个特性 public string Message { get; set; } public Dictionary<string, OutputValueItem> Outputs { get; set; } }
第二步:反序列化后遍历取值
System.Text.Json(.NET Core 3.0+ 自带库)示例:
using System.Text.Json; // 反序列化 var root = JsonSerializer.Deserialize<RootJsonModel>(yourJsonString); // 遍历所有动态键和对应值 foreach (var (key, item) in root.Outputs) { Console.WriteLine($"键名:{key},对应value:{item.Value}"); }
Newtonsoft.Json(Json.NET)示例:
using Newtonsoft.Json; // 反序列化 var root = JsonConvert.DeserializeObject<RootJsonModel>(yourJsonString); // 遍历取值和上述一致 foreach (var kvp in root.Outputs) { Console.WriteLine($"键名:{kvp.Key},对应value:{kvp.Value.Value}"); }
方式2:无实体类直接遍历节点
如果不想定义实体类,可以直接解析为JSON节点对象遍历:
System.Text.Json 示例:
using System.Text.Json; var doc = JsonDocument.Parse(yourJsonString); var outputsNode = doc.RootElement.GetProperty("outputs"); foreach (var property in outputsNode.EnumerateObject()) { string key = property.Name; string value = property.Value.GetProperty("value").GetString(); Console.WriteLine($"键名:{key},对应value:{value}"); }
Newtonsoft.Json 示例:
using Newtonsoft.Json.Linq; var jObj = JObject.Parse(yourJsonString); var outputsNode = jObj["outputs"] as JObject; foreach (var property in outputsNode.Properties()) { string key = property.Name; string value = property.Value["value"].ToString(); Console.WriteLine($"键名:{key},对应value:{value}"); }
注意事项
- 如果
value的类型不固定(可能是数字、布尔等),需要根据实际场景做类型判断和转换 - 生产环境建议加空值判断,避免
outputs节点不存在或者value为空时抛出异常
内容的提问来源于stack exchange,提问作者nen
相关产品推荐
相关产品推荐

