Jaz*_*mov 44 c# linq json json.net
我无法理解时使用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();
}
Run Code Online (Sandbox Code Playgroud)
那时,我接受JSON字符串对象并将其反序列化为JObject(这可能是我的错误 - 也许我需要创建jsonWork一个JToken或JContainer?):
JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);
Run Code Online (Sandbox Code Playgroud)
在我的JSON数据(由JSON表示的字符串)中,我有三个对象 - 顶级对象看起来类似于:
{
"Object1" : { ... },
"Object2" : { ... },
"Object3" : { ... }
}
Run Code Online (Sandbox Code Playgroud)
每个对象都由各种标记(数组,字符串,其他对象等)组成,因此它是动态JSON.(我使用省略号作为占位符,而不是用大量JSON数据混淆这个问题.)
我要处理"Object1","Object2"和"Object3"单独使用LINQ,但是.所以,理想情况下,我想要这样的事情:
// these lines DO NOT work
var jsonObject1 = jsonWork.Children()["Object1"]
var jsonObject2 = jsonWork.Children()["Object2"]
var jsonObject3 = jsonWork.Children()["Object3"]
Run Code Online (Sandbox Code Playgroud)
但上述行失败了.
我用var上面的,因为我不知道我应该使用什么样的对象类型:JContainer,JObject或JToken!只是让你知道我想要做什么,一旦jsonObject#正确分配了上述变量,我想使用LINQ来查询它们包含的JSON.这是一个非常简单的例子:
var query = from p in jsonObject1
where p.Name == "Name1"
select p
Run Code Online (Sandbox Code Playgroud)
当然,我的LINQ最终将在jsonObject变量中过滤JSON数组,对象,字符串等.我想,一旦我开始,我可以使用LinqPad帮助我使用LINQ过滤JSON.
我发现如果我使用:
// this line WORKS
var jsonObject1 = ((JObject)jsonWork).["Object1"];
Run Code Online (Sandbox Code Playgroud)
然后我得到一个JObject类型jsonObject1.这是正确的方法吗?
我不清楚何时/为什么一个人会JContainer在看起来JToken和JObject对象很好地使用LINQ 时使用它.目的是JContainer什么?
Bri*_*ers 222
JContainer在大多数情况下,您并不需要担心.它可以帮助组织LINQ-to-JSON并将其构建为良好的代码.
该JToken层次结构如下所示:
JToken - abstract base class
JContainer - abstract base class of JTokens that can contain other JTokens
JArray - represents a JSON array (contains an ordered list of JTokens)
JObject - represents a JSON object (contains a collection of JProperties)
JProperty - represents a JSON property (a name/JToken pair inside a JObject)
JValue - represents a primitive JSON value (string, number, boolean, null)
Run Code Online (Sandbox Code Playgroud)
所以你看,a 是 a ,是一个. JObject JContainerJToken
这是基本的经验法则:
{和}JSON表示),请使用JObject[和],使用)JArrayJValueJToken.然后,您可以检查其Type属性以确定它是什么类型的标记并适当地转换它.Eli*_*bel 19
JContainer是具有子项的JSON元素的基类.JObject,JArray,JProperty和JConstructor所有从它继承.
例如,以下代码:
(JObject)JsonConvert.DeserializeObject("[1, 2, 3]")
Run Code Online (Sandbox Code Playgroud)
会抛出一个InvalidCastException,但是如果你把它投到一个JContainer,那就没事了.
关于你的原始问题,如果你知道你在顶层有一个JSON对象,你可以使用:
var jsonWork = JObject.Parse(json);
var jsonObject1 = o["Object1"];
Run Code Online (Sandbox Code Playgroud)