我无法理解何时使用JContainer
, JObject
, and JToken
。我从“标准”中了解到JObject
由...组成JProperties
然后JToken
是所有的基本抽象类JToken
类型,但我不明白JContainer
.
我正在使用 C#,并且刚刚购买了 LinqPad Pro 5。
我的文件中有一个 JSON 数据源,因此我使用以下语句成功反序列化该文件的内容:
string json;
using (StreamReader reader = new StreamReader(@"myjsonfile.json"))
{
json = reader.ReadToEnd();
}
此时,我获取 JSON 字符串对象并将其反序列化为JObject
(这可能是我的错误——也许我需要做jsonWork
a JToken
or JContainer
?):
JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);
在我的 JSON 数据(由 JSON 表示的字符串)中,我有三个对象 - 顶级对象与此类似:
{
"Object1" : { ... },
"Object2" : { ... },
"Object3" : { ... }
}
每个对象都由各种标记(数组、字符串、其他对象等)组成,因此它是动态 JSON。 (我使用省略号作为占位符,而不是用大量 JSON 数据来混淆这个问题。)
我要处理"Object1"
, "Object2"
, and "Object3"
然而,单独使用 LINQ。所以,理想情况下,我想要这样的东西:
// these lines DO NOT work
var jsonObject1 = jsonWork.Children()["Object1"]
var jsonObject2 = jsonWork.Children()["Object2"]
var jsonObject3 = jsonWork.Children()["Object3"]
但以上几行失败了。
I used var
上面是因为我不知道应该使用什么对象类型:JContainer
, JObject
, or JToken
!只是为了让你知道我想做什么,一旦完成上述jsonObject#
变量已正确分配,我想使用 LINQ 查询它们包含的 JSON。这是一个非常简单的例子:
var query = from p in jsonObject1
where p.Name == "Name1"
select p
当然,我的 LINQ 最终会过滤 JSON 数组、对象、字符串等,在jsonObject
多变的。我想一旦开始,我就可以使用 LinqPad 来帮助我使用 LINQ 过滤 JSON。
我发现如果我使用:
// this line WORKS
var jsonObject1 = ((JObject)jsonWork).["Object1"];
然后我得到一个JObject
输入jsonObject1
。这是正确的方法吗?
我不清楚何时/为何使用JContainer
当看起来JToken
and JObject
对象与 LINQ 配合得很好。目的是什么JContainer
?