【发布时间】:2016-11-28 06:28:32
【问题描述】:
我无法理解何时使用 JContainer、JObject 和 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 设置为 JToken 或 JContainer?):
JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);
在我的 JSON 数据(JSON 表示的字符串)中,我有三个对象——顶级对象看起来类似于:
{
"Object1" : { ... },
"Object2" : { ... },
"Object3" : { ... }
}
每个对象都由各种标记(数组、字符串、其他对象等)组成,因此它是动态 JSON。 (我使用省略号作为占位符,而不是用大量 JSON 数据混淆这个问题。)
但是,我想使用 LINQ 分别处理 "Object1"、"Object2" 和 "Object3"。所以,理想情况下,我想要这样的东西:
// these lines DO NOT work
var jsonObject1 = jsonWork.Children()["Object1"]
var jsonObject2 = jsonWork.Children()["Object2"]
var jsonObject3 = jsonWork.Children()["Object3"]
但是以上几行都失败了。
我在上面使用了var,因为我不知道应该使用什么对象类型:JContainer、JObject 或JToken!只是为了让您知道我想要做什么,一旦正确分配了上述jsonObject# 变量,我想使用 LINQ 来查询它们包含的 JSON。这是一个非常简单的例子:
var query = from p in jsonObject1
where p.Name == "Name1"
select p
当然,我的 LINQ 最终会在 jsonObject 变量中过滤 JSON 数组、对象、字符串等。我想一旦开始,我可以使用 LinqPad 帮助我使用 LINQ 过滤 JSON。
我发现如果我使用:
// this line WORKS
var jsonObject1 = ((JObject)jsonWork).["Object1"];
然后我得到一个JObject 输入jsonObject1。这是正确的方法吗?
当JToken 和JObject 对象似乎可以很好地与LINQ 配合使用时,我不清楚何时/为什么会使用JContainer。 JContainer的目的是什么?
【问题讨论】: