Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何循环通过JSON对象(而不是数组)?_C#_Json_Json.net - Fatal编程技术网

C# 如何循环通过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客户端,我以字符串形式接

JSON数据的格式如下:

"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