想从动态对象访问动态属性名

问题描述 投票:0回答:2

我有以下 JSON 格式。

{
   "data": [
     {
        "id": 1,
        "variants": [
            {
               "name": "Test",
               "images": {
                    "WHITE": [
                         {
                           "id": 13,
                           "name": "Testname"
                         }
                      ]
                 } 
            }
           ] 
     }
     ]
}

现在我使用以下方法对其进行脱盐:

var items = JsonConvert.DeserializeObject<dynamic>(content);

然后在项目中我得到变体。

我正在使用动态,因为在这个图像节点中,某些记录中它作为空数组出现,而在某些记录中它作为 JSON 对象出现所以..

我有以下动态对象。如果我写下以下控制台行,则会出现以下输出。

Console.WriteLine(variant.images)

它的输出如下所示:

{
   "WHITE": [ // I want to get this WHITE in one variable, this color name.
       {
          "id": 13,
          "name": "Testname"
       }
    ]
}

现在这个白色会在少数记录中变得充满活力,它可以变成黑色,在少数记录中它可以变成红色..

所以基于那个颜色值我需要进一步的逻辑。那么我如何才能访问该值。

我想将该颜色名称值保存在一个变量中,然后再使用它。

谢谢

c# asp.net json asp.net-core object
2个回答
0
投票

我会避免反序列化为

dynamic
,而是使用
JObject.Parse()

如果您知道要搜索的颜色名称:

var input = "{\"data\":[{\"id\":1,\"variants\":[{\"name\":\"Test\",\"images\":{\"WHITE\":[{\"id\":13,\"name\":\"Testname\"}]}}]}]}";
var json = JObject.Parse(input);
var colorToSearchFor = "WHITE";
var colorElement = json.SelectToken($"$.data[0].variants[0].images.{colorToSearchFor}[0]", true)!;

Console.WriteLine(colorElement["id"]!.Value<int>());
Console.WriteLine(colorElement["name"]!.Value<string>());

// prints "13" and "Testname"

如果你不知道颜色名称是什么,但知道它应该在哪里:

var input = "{\"data\":[{\"id\":1,\"variants\":[{\"name\":\"Test\",\"images\":{\"WHITE\":[{\"id\":13,\"name\":\"Testname\"}]}}]}]}";
var json = JObject.Parse(input);
var imagesElement = json.SelectToken($"$.data[0].variants[0].images", true) as JObject;

foreach (var possibleColorElement in imagesElement.Properties())
{
    Console.WriteLine(possibleColorElement.Name);
}

// Prints "WHITE"

我的令牌选择器有很多

[0]
的,所以如果您要查找的对象不是数组中的第一个对象,请调整它们。
[*]
可能有用,但要小心使用。


0
投票

我已经多次向您展示了如何使用 LINQ

    var jObj = JObject.Parse(json);
    
    List<string> imageColors = jObj["data"]
                      .SelectMany(x => ((JArray)x["variants"])
                      .Select(x => ((JObject)x["images"])
                      .Properties().FirstOrDefault().Name))
                      .ToList(); // or FirstOrDefault if you want one colour

    string firstImageColor = imageColors[0]; // "WHITE"
© www.soinside.com 2019 - 2024. All rights reserved.