[英]How get List of JSON Objects from within a JSON object (non-array) (NOT Deserializing)
我在 Json.NET NuGet 中使用 C#。 我有如下所示的 JSON:
{
"pre" : "",
"options": {
"0001" : {
"id" : "0001",
"desc" : "first"
},
"0002" : {
"id" : "0002",
"desc" : "second"
},
"0003" : {
"id" : "0003",
"desc" : "third"
}
},
"post" : ""
}
List<JObject>
?或者/还有我怎样才能得到第 2 项应该是的第二项:
{ "id" : "0002", "desc" : "second" }
我试过类似的东西
var items = json.SelectTokens("options[*]").ToList();
和
var item = json.SelectTokens("options[1]");
但那些显然不起作用。
编辑:
如果我不清楚,我不想反序列化。 我想要一个List<JObject>
。
你的 json 是有效的,但你对这个 json 的想法不太准确。
您认为 options 有一个您想要迭代的对象列表,但事实并非如此。 options
不是一个列表,而是一个包含更多对象的对象。不是一个数组。
您可以通过首先查找 JObject 的属性来访问 JObject 中的每个元素。 属性是 0001、0002 等。一旦你有了这些,你就可以遍历选项的属性并获得你需要的值。
JObject options = (JObject)JObject.Parse(json)["options"];
// Get a list of all tokens within this object.
List<JObject> allObjects = new List<JObject>();
foreach (var node in options.Properties())
allObjects.Add((JObject)options[node.Name]);
// Access the IDs
allObjects.ForEach(x => Console.WriteLine(x["id"].ToString()));
// Access the 2nd ID only
Console.WriteLine(); // Just to space it out.
Console.WriteLine(allObjects[1]["id"].ToString());
输出
0001
0002
0003
0002
您可以使用 Linq 创建所需的列表。 例如,
var list = ((JObject)JObject.Parse(str)["options"])
.Properties()
.Select(x=>x.Value)
.Cast<JObject>()
.ToList();
要访问第二个元素,您可以使用
var secondId = (string)list[1]["id"];
var secondDesc = (string)list[1]["desc"];
我实际上很接近但太努力了:
var items = json.SelectToken("options").ToList();
我无法弄清楚如何从查询中获取单个选项,但由于我得到了整个列表,我是这样做的:
var item = json.SelectToken("options").ToList()[1];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.