JContainer、JObject、JToken 和 Linq 混淆

2023-11-21

我无法理解何时使用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?


你真的不需要担心JContainer在多数情况下。它可以帮助组织和构建LINQ 到 JSON转化为精心分解的代码。

The 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)

所以你看,一个JObject is a JContainer, which is a JToken.

这是基本的经验法则:

  • 如果你知道你有一个对象(用大括号表示){ and }在 JSON 中),使用JObject
  • 如果您知道您有一个数组或列表(用方括号表示)[ and ]), use JArray
  • 如果您知道自己有一个原始值,请使用JValue
  • 如果您不知道自己拥有哪种令牌,或者希望能够以通用方式处理上述任何一种,请使用JToken。然后你可以检查它的Type属性来确定它是什么类型的令牌并对其进行适当的转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JContainer、JObject、JToken 和 Linq 混淆 的相关文章

随机推荐

  • JavaScript获取url段和参数

    我读过一些问题 但我仍然不知道该怎么做我有一个网址example com event 14aD9Uxp p 10 在这里我想得到14aD9Uxp和 p 的值我尝试过使用split p 但这不起作用我想使用正则表达式 但我不太明白如何使用它
  • 在桌面上运行时如何将 Windows 10 通用应用程序的窗口最大化至全屏?

    使用 Windows 10 或 Windows 8 1 WinRT 构建通用应用程序时 是否可以强制应用程序的主窗口在启动时最大化 这显然是应用程序在移动设备上运行时的自然行为 但在桌面上运行时则不然 使用 WinForms 这当然是可能的
  • 在 Spring Boot 中使用 Angular 启用 Cors,仍然存在 Cors 错误

    我为所有来源和标头启用了 cors 但当我调用 a 时 我仍然收到 cors 错误get从我的角度应用程序到 Spring Boot 的方法 来自控制台的 Cors 错误 Access to XMLHttpRequest at http l
  • 返回任务是否违反了 CQS 原则?

    CQS 原则 https en wikipedia org wiki Command E2 80 93query separation 指出命令应返回 void 对于异步方法的建议是永远不要返回 void https msdn micros
  • 将任何 XML 文档绑定到 WPF TreeView

    我想使用 TypeConverter 将任何 XML 文档绑定到 WPF TreeView 我最初的解决方案是使用递归 但是当文档很大时 UI 就会严重依赖 以下链接讨论了 TypeConverter 但针对特定的节点 元素组合 http
  • 使用 FileReference 下载时丢失扩展名

    我需要用户从我的应用程序下载 JPEG 文件 但是 当用户更改文件名时 将下载保存的文件 不带扩展名 例如 我正在使用 FileReference download 并将默认文件名设置为 demoPic jpg 并且用户的 Windows
  • “@android:drawable/ic_”与“@*android:drawable/ic_”

    有人知道在哪里可以找到有关星号的文档吗 它似乎覆盖了子类 android R drawable 中 私有 变量的保护 android 用于访问私有资源 这些资源可能会在两个 Android 版本之间更改或删除 因此您永远不应该使用它们 这仅
  • 将所有 Neo4J 数据库加载到 RAM

    我正在尝试将所有 Neo4j DB 加载到 RAM 以便查询速度更快 当将属性映射传递到图形创建时 我没有看到该过程像以前那样占用更多的内存空间 而且它也与磁盘上的文件空间不成比例 可能是什么问题呢 以及如何修复它 谢谢 Neo4j 延迟加
  • 删除 Dask 中的空分区

    从 CSV 加载数据时 某些 CSV 无法加载 从而导致分区为空 我想删除所有空分区 因为某些方法似乎不适用于空分区 我尝试过重新分区 其中 例如 repartition npartitions 10 有效 但大于此值仍可能导致空分区 实现
  • Babel 6 regeneratorRuntime 未定义

    我正在尝试在 Babel 6 上从头开始使用 async await 但我得到了regeneratorRuntime没有定义 babelrc 文件 presets es2015 stage 0 package json 文件 devDepe
  • 如何测试 Spring 集成

    我是 Spring 集成的新手 我有 ActiveMQ 有一个 responseQ 因此 当消息到达 responseQ 时 gt painResponseChannel gt Transformer gt processResponseC
  • 获取执行jpql查询后更新的记录数

    如何在执行 jpql 查询后获取更新的记录数 例如 UPDATE Device d SET d name Name WHERE d locationId id Modifying Query UPDATE Device d SET d na
  • 如何阻止 jQuery mobile 的自动页面样式化?

    jQuery Mobile 在加载时自动向页面上的所有元素添加类 这确实弄乱了我页面上的 jQuery UI 小部件 有没有办法阻止 jQuery mobile 自动向我的 HTML 元素添加类 我只想在我的页面上显示一些 jQuery 移
  • MouseBinding 上的 WPF 键盘修饰符

    我正在 WPF 中使用 MVVM 模式 对两者来说都有点新 我想设立一个InputBinding on a CheckBox对应于一个Control Click事件 但没有看到Modifiers财产在MouseBinding元素 这就是我想
  • RabbitMQ - 使用curl从队列中获取消息

    我正在尝试使用rabbitmq的HTTP API从队列中获取一些消息 我正在关注中的文档here我没有vhost配置 我尝试了以下curl命令 curl i u guest guest H content type application
  • 使用QSignalMapper时如何保留源信号的参数?

    我遇到了一个问题 我需要保留映射的源信号的参数 到目前为止 我只找到了没有任何参数的映射信号的示例 例如 clicked 信号 signalMapper new QSignalMapper this signalMapper gt setM
  • 如何使用 Devise Authentication 来验证注册电子邮件地址是否来自特定域?

    我想确保只有具有特定域的电子邮件地址的人才能注册使用 Devise 的网站 例如 如果人们使用电子邮件注册 电子邮件受保护 他们应该会收到一封确认电子邮件 但如果注册的是 电子邮件受保护 他们应该会收到错误消息 取消注释 config in
  • 如何编写带有迭代器的 Rust 函数?

    我想编写一个接受迭代器并返回对其进行某些操作的结果的函数 具体来说 我试图迭代 a 的值HashMap use std collections HashMap fn find min lt a gt vals Iterator
  • PHP:这些日期(差异?)格式参数是什么(例如%R%a)

    我遇到了一些例子 人们共享计算两天之间差异的代码 Eg now new DateTime itemDate gt diff now gt format r a 但几乎总是这些类型的帖子并没有真正解释格式参数的含义 我对常规日期格式参数没问题
  • JContainer、JObject、JToken 和 Linq 混淆

    我无法理解何时使用JContainer JObject and JToken 我从 标准 中了解到JObject由 组成JProperties然后JToken是所有的基本抽象类JToken类型 但我不明白JContainer 我正在使用 C