如何从dynamic对象中获取动态属性名(如颜色名称)
问题描述
我有如下JSON格式:
{ "data": [ { "id": 1, "variants": [ { "name": "Test", "images": { "WHITE": [ { "id": 13, "name": "Testname" } ] } } ] } ] }
我使用以下方法反序列化它:
var items = JsonConvert.DeserializeObject<dynamic>(content);
之后从items中获取到variants。
注:我使用dynamic是因为images节点在部分记录中是空数组,在部分记录中是JSON对象。
得到dynamic对象后,执行以下控制台输出语句:
Console.WriteLine(variant.images)
输出结果如下:
{ "WHITE": [ // 我想将这个WHITE存入变量,即颜色名称。 { "id": 13, "name": "Testname" } ] }
这个颜色值是动态的,部分记录中可能是BLACK或RED等。我需要将该颜色名称存入变量并用于后续逻辑,请问如何仅获取这个值?
解决方案
因为你用的是dynamic结合Newtonsoft.Json(JsonConvert),可以把variant.images转换成JObject来处理,这样就能获取动态的键名:
方法1:直接获取第一个颜色键
如果images对象里只会存在一个颜色键(如示例场景),可以用以下代码:
using Newtonsoft.Json.Linq; // 假设已拿到variant这个dynamic对象 JObject imagesObj = variant.images as JObject; if (imagesObj != null) { string colorName = imagesObj.Properties().First().Name; // 此时colorName即为WHITE/BLACK/RED等,可用于后续逻辑 Console.WriteLine(colorName); }
方法2:兼容空数组场景
考虑到images有时是空数组,需要先判断类型再处理:
using Newtonsoft.Json.Linq; dynamic images = variant.images; string colorName = null; if (images is JObject imagesObj) { // 是JSON对象时取第一个键名 colorName = imagesObj.Properties().First().Name; } else if (images is JArray) { // 是空数组时按需求处理,比如赋值默认值或跳过 colorName = "无颜色"; } // 后续使用colorName的逻辑 if (!string.IsNullOrEmpty(colorName)) { // 你的业务代码 }
补充说明
JObject.Properties()可以获取对象的所有属性键,若每个images对象仅对应一个颜色,取第一个即可满足需求。- 代码需引用
Newtonsoft.Json.Linq命名空间,否则无法使用JObject和JArray类型。
内容的提问来源于stack exchange,提问作者Sami In
相关产品推荐
相关产品推荐

