C# 如何循环通过JSON对象(而不是数组)?
JSON数据的格式如下:C# 如何循环通过JSON对象(而不是数组)?,c#,json,json.net,C#,Json,Json.net,JSON数据的格式如下: "data": { "x-y": { "name": "x-y", "enabled": true, }, "a-b": { "name": "a-b", "enabled": true, }, } 从WebSocket客户端,我以字符串形式接
"data": {
"x-y": {
"name": "x-y",
"enabled": true,
},
"a-b": {
"name": "a-b",
"enabled": true,
},
}
从WebSocket客户端,我以字符串形式接收数据。“数据”中的键值对数量不是固定的,即一次它可能只返回“x-y”,另一次它可能返回“x-y”、“a-b”、“foo-bar”等。。而且可能收到的密钥的名称未知
根据我使用WebSockets和JSON的短暂而有限的经验,似乎在这样的场景中,数据通常会包含在一个数组中—类似这样的情况:
"data": [
{
"name": "x-y",
"enabled": true,
},
{
"name": "a-b",
"enabled": true,
},
]
在第二个场景中,我可以在数据上循环-没问题。是否可以对数据执行与第一个示例中类似的操作?AFAICT,但在C#中找不到类似的解决方案。以下是关于将JSON解析为C#对象的文档。您提到not array,不确定您是否暗示JSON具有对象而不是数组,或者您希望在C#中不作为数组
有许多方法和变体(不限于以下) 给定的
public class Stuff {
public string name { get; set; }
public bool enabled { get; set; }
}
public class Root {
public Dictionary<string,Stuff> data { get; set; }
}
如果可能的话,在javascript中。。。。。当然,C#可以做到这一点,不仅如此,它在做这件事的时候看起来还不错。反序列化到一个
JObject
Ahh,结果是他们把它结构化为data:{data:{..
(两个数据-没有别的,只是纯粹冗余!).JObject也是我所需要的-现在可以使用了,谢谢!将它反序列化到列表中。每个字典代表集合中的一个对象。键集合提供了属性名称。我想我写的东西没有意义,很抱歉。我误解了它的工作原理。谢谢你在那里给我提示)。没问题!哈哈
var input = "{\"data\": {\r\n \"x-y\": {\r\n \"name\": \"x-y\",\r\n \"enabled\": true,\r\n },\r\n \"a-b\": {\r\n \"name\": \"a-b\",\r\n \"enabled\": true,\r\n },\r\n}}";
var result = JsonConvert.DeserializeObject<Root>(input);
Console.WriteLine("Attempt 1");
foreach (var item in result.data.Values)
Console.WriteLine($"{item.name} {item.enabled}");
// or
Console.WriteLine("Attempt 2");
var asd = JObject.Parse(input);
foreach (var item in asd["data"].Children().SelectMany(x => x))
Console.WriteLine($"{item["name"]} {item["enabled"]}");
Attempt 1
x-y True
a-b True
Attempt 2
x-y True
a-b True