C# 如何查询多个json节点?

C# 如何查询多个json节点?,c#,json,.net,json.net,C#,Json,.net,Json.net,我有以下json: { "key445" : { "text" : "cat", "id" : 445 }, "key457" : { "text" : "mouse", "id" : 457 }, "key458" : { "text"

我有以下json:

{
  "key445" : {
    "text" : "cat",
    "id" : 445
  },
  "key457" : {
    "text" : "mouse",
    "id" : 457
  },
  "key458" : {
    "text" : "rodent",
    "id" : 458
  }
}
我正在尝试将
文本
id
提取到
列表
(一个带有字符串和int的类),甚至分别提取到
列表
列表

我使用
JObject.Parse
方法将文本读入JObject。但是,我不知道如何访问文本和id节点。我尝试了以下方法,但它没有返回任何结果

var textTokens = o.SelectTokens("/*/text");
var idTokens = o.SelectTokens("/*/id");

如何获得所需的令牌?

我只需将整个JSON转换为一个
字典
,而不必尝试使用JsonPath:

使用Newtonsoft.Json;
使用制度;
使用System.Collections.Generic;
使用System.IO;
公共类文本标识符
{
公共字符串文本{get;set;}
公共int Id{get;set;}
公共重写字符串ToString()=>$“Id:{Id};Text:{Text}”;
}
公开课考试
{
静态void Main()
{
var json=File.ReadAllText(“test.json”);
var dictionary=JsonConvert.DeserializeObject(json);
foreach(字典中的var对)
{
Console.WriteLine($“{pair.Key}=>{pair.Value}”);
}
}
}
输出:

key445 => Id: 445; Text: cat
key457 => Id: 457; Text: mouse
key458 => Id: 458; Text: rodent

如果您不关心键,可以使用
dictionary.Values.ToList()
来获取
列表
,尽管您不应该依赖它们的顺序。

我只需将整个JSON转换为
字典
,而不必尝试使用JsonPath:

使用Newtonsoft.Json;
使用制度;
使用System.Collections.Generic;
使用System.IO;
公共类文本标识符
{
公共字符串文本{get;set;}
公共int Id{get;set;}
公共重写字符串ToString()=>$“Id:{Id};Text:{Text}”;
}
公开课考试
{
静态void Main()
{
var json=File.ReadAllText(“test.json”);
var dictionary=JsonConvert.DeserializeObject(json);
foreach(字典中的var对)
{
Console.WriteLine($“{pair.Key}=>{pair.Value}”);
}
}
}
输出:

key445 => Id: 445; Text: cat
key457 => Id: 457; Text: mouse
key458 => Id: 458; Text: rodent

如果你不关心键,你可以使用
dictionary.Values.ToList()
来获得一个
列表
,尽管你不应该依赖它们的顺序。

有什么理由解析成
JObject
而不是解析成
dictionary
,我怀疑这会立即起作用吗?@JonSkeet没有理由,我只是不知道怎么做。JObject似乎是调试这个的好方法。对。因此,如果
TextIdentifier
具有
Text
Id
的可写属性,那么您需要做的就是:)@jonsket我的问题是找到正确的JsonPath查询来从json中提取这些令牌。一旦我得到它们,我肯定可以将它们写入一个对象。我的观点是,您根本不需要使用JsonPath。只需将整个对象转换为
字典
,如果只需要值,只需使用
属性即可。除非您需要按照JSON文件的顺序使用它们,否则JSON文件将非常脆弱。(现在添加一个示例。)有什么理由解析成
JObject
而不是解析成
Dictionary
,我怀疑这会立即起作用吗?@JonSkeet没有理由,我只是不知道怎么做。JObject似乎是调试这个的好方法。对。因此,如果
TextIdentifier
具有
Text
Id
的可写属性,那么您需要做的就是:)@jonsket我的问题是找到正确的JsonPath查询来从json中提取这些令牌。一旦我得到它们,我肯定可以将它们写入一个对象。我的观点是,您根本不需要使用JsonPath。只需将整个对象转换为
字典
,如果只需要值,只需使用
属性即可。除非您需要按照JSON文件的顺序使用它们,否则JSON文件将非常脆弱。(现在添加一个样本)哇,这真是太完美了。我希望我能投更多的票。哇,真是太好了。我希望我能投更多的票。