当前位置: 首页 > 面试题库 >

JContainer,JObject,JToken和Linq混淆

邰伟彦
2023-03-14
问题内容

我无法理解时使用JContainerJObjectJToken。我从该“标准”的理解JObject是由JPropertiesJToken是所有的基础抽象JToken的类型,但我不明白JContainer

我正在使用C#,而我刚购买了LinqPad Pro 5。

我在文件中有一个JSON数据源,因此我正在使用以下语句成功反序列化该文件的内容:

string json;
using (StreamReader reader = new StreamReader(@"myjsonfile.json"))
{
    json = reader.ReadToEnd();
}

那时,我将JSON字符串对象反序列化为a JObject(这可能是我的错误-
也许我需要jsonWork输入JTokenor或JContainer?):

JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);

在我的JSON数据(由JSON表示的字符串)中,我有三个对象-顶级对象与此类似:

{
  "Object1" : { ... },
  "Object2" : { ... },
  "Object3" : { ... }
}

每个对象都由各种标记(数组,字符串,其他对象等)组成,因此它是动态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"]

但是以上几行失败了。

我用var上面的,因为我不知道我应该使用什么样的对象类型:JContainerJObjectJToken!就是这样,您知道我想做什么,一旦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。这是正确的方法吗?

目前还不清楚我的时候/为什么人会使用JContainer的时候似乎JTokenJObject反对使用LINQ工作得很好。目的是JContainer什么?


问题答案:

JContainer是具有子项的JSON元素的基类。JObjectJArrayJPropertyJConstructor从它的所有继承。

例如,以下代码:

(JObject)JsonConvert.DeserializeObject("[1, 2, 3]")

会抛出一个InvalidCastException,但是如果将其强制转换为JContainer,那就很好了。

关于您的原始问题,如果知道您在顶层有JSON对象,则可以使用:

var jsonWork = JObject.Parse(json);
var jsonObject1 = jsonWork["Object1"];


 类似资料:
  • JToken SSO 令牌单点登录集成插件,为多个系统的单点登录集成提供一键登录和一键注销的功能,以 API 接口方式提供集成,只需编写简短的几行集成代码,集成开发方便。系统间以共享密钥文件,向客户端用户发放令牌,采用私钥加密和公钥解密的方式进行传递和认证。

  • 问题内容: 我正在尝试找出如何在LINQ中编写SQL语句,但是暂时找不到一种方法,这是SQL命令: 有人可以帮我使用linq语法吗? **到目前为止,我一直在尝试(感谢levanlevi) 但我收到以下错误: http://i.stack.imgur.com/AkJ5V.png 问题答案:

  • 大多数应用程序都是以数据为中心的,但大多数数据存储库都是关系数据库。 多年来,设计人员和开发人员基于对象模型设计了应用程序。 对象负责连接到数据访问组件 - 称为数据访问层(DAL)。 在这里我们要考虑三点: 应用程序中所需的所有数据都不存储在同一个源中。 源可以是关系数据库,某些业务对象,XML文件或Web服务。 访问内存中对象比从数据库或XML文件访问数据更简单,更便宜。 访问的数据不直接使用

  • $linq 是 .NET 库 LINQ 的 JavaScript 版,支持查询、条件查询、排序、distinct、分组、联合和排除查询等。 $linq 同时实现了一些来自 MoreLinq 中的方法,可与 jQuery 的集合和数组协作。 示例程序: var people = [{ Name: "Senthil Kumar"},     { Name: "Norton Stanley"},    

  • 语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。 传 统上,针对数据的查询都是以简单的字符串表示,而没有编译时类型检查或 IntelliSense 支持。此外,您还必须针对以下各种数据源学习不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。LINQ 使查

  • 问题内容: 我有一个SQL语句,我正在尝试将其转换为LINQ to SQL,并且已经设法将其中的大多数转换了,但是遇到了一个语句,我无法在LINQ中全神贯注。 引起头痛的SQL查询部分是: 是包含一系列操作的表,是可用操作的列表。是状态列表的索引-4 ==’失败’。 基本上,对于 未 失败的动作,它需要返回 下一个 动作。如果行动 已经 失败,它返回 当前 的行动。 这只是联接之一(完整查询中总共