我有以下 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"
}
]
}
现在这个白色会在少数记录中变得充满活力,它可以变成黑色,在少数记录中它可以变成红色..
所以基于那个颜色值我需要进一步的逻辑。那么我如何才能访问该值。
我想将该颜色名称值保存在一个变量中,然后再使用它。
谢谢
我会避免反序列化为
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]
的,所以如果您要查找的对象不是数组中的第一个对象,请调整它们。 [*]
可能有用,但要小心使用。
我已经多次向您展示了如何使用 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"