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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:55:21