json 路径表达式在没有数组的情况下不起作用

2023-12-10

我正在尝试实现一个看似简单的 JSON 路径过滤器,但未能使其正常工作。想知道其他对 Json.NET 的 JSON 路径实现有更多经验的人是否对后续步骤有想法。

这种情况失败了,但我认为应该可行?

var jsonText = @"{
    'event': {
        'data': {
            'intField': 1,
            'stringField': 'hello'
        }
    }
}";

JObject json = JsonConvert.DeserializeObject<JObject>(jsonText);
string jsonPath = "$.event.data[?(@.intField == 1)]";
IList<JToken> output = json.SelectTokens(jsonPath).ToList();

// this check fails
Assert.IsTrue(output.ToList().Count > 0);

如果我通过在“数据”对象周围添加虚拟数组来处理 JSON 有效负载,那么我就可以让查询正常工作。但是,我宁愿不处理 JSON 有效负载。

var jsonText = @"{
    'event': {
        'data': [{
            'intField': 1,
            'stringField': 'hello'
        }]
    }
}";

JObject json = JsonConvert.DeserializeObject<JObject>(jsonText);
string jsonPath = "$.event.data[?(@.intField == 1)]";
IList<JToken> output = json.SelectTokens(jsonPath).ToList();

// now this works
Assert.IsTrue(output.ToList().Count > 0);

问题是 Json.NET 对 JsonPATH 过滤表达式运算符的实现[?()]仅适用于过滤集合(数组)内的对象,不适用于其他对象内的对象。此限制报告于问题 #1256:JSONPath 脚本无法正确执行对象,Newtonsoft 回复道:

我对此不太确定。 JSONPath 中没有任何内容表明过滤器应应用于对象。
JamesNK评论于 2017 年 3 月 24 日

这种限制有时会出现,例如使用 Newtonsoft.Json.NET 搜索 JSON 根对象的正确 JsonPath 表达式是什么? or 如何过滤 JsonPath 中的非数组。您可能想要添加评论GitHub 上的问题如果您发现对对象内部的对象进行过滤很有用。

解决方法有时的工作是添加递归下降运算符..在包含对象属性名称和过滤表达式运算符之间,如下所示:

string jsonPath = "$.event.data..[?(@.intField == 1)]";

而且,在您的具体情况下,修改后的查询现在可以运行并选择一个对象。演示小提琴here.

当然,这个修改后的查询也将匹配如下内容:

{
  "event": {
    "data": {
      "extra_added_level_of_nesting": {
        "intField": 1,
        "stringField": "hello"
      }
    }
  }
}

(小提琴#2here)因此该解决方法可能不足以满足您的需求。

该解决方法之所以成功,是因为 Json.NET 显然将递归下降运算符返回的结果视为一个集合,因此可以对其应用过滤表达式运算符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

json 路径表达式在没有数组的情况下不起作用 的相关文章

随机推荐

  • 将图像上传到 Google Cloud Storage (Java)

    我想开发一个java应用程序 适用于pc 可以将任何图片上传到谷歌云存储 尽管我花了整个晚上的时间来寻找解决方案 但我不知道如何开始 你们中有人有将图像上传到 Google Cloud Storage 的经验吗 谷歌云存储有更好的替代品吗
  • 将 Matlab 函数结果缓存到文件

    我正在用 Matlab 编写一个模拟 我最终会运行这个模拟数百次 在每次仿真运行中 都有数百万个仿真周期 在每个周期中 我都会计算一个非常复杂的函数 该函数需要 0 5秒完成 函数输入是一个长位数组 gt 1000 位 这是一个数组0 an
  • 如何使用单个命令在 Apache Kafka 中创建主题列表

    截至目前 我正在使用以下命令一一创建一个主题 sh bin kafka topics create zookeeper localhost 2181 topic sdelivery replication factor 1 partitio
  • Java 是否有相当于 C# 的“yield”关键字?

    我知道 Java 本身没有直接的等价物 但也许有第三方 真的很方便 目前我想实现一个迭代器 它生成树中的所有节点 大约有五行带有yield的代码 我知道的两个选项是Aviad Ben Dov 2007 年的 infomancers coll
  • 如何将 LocalDate 转换为 SQL Date Java?

    如何将 LocalDate 转换为java sql Date Attempt Record r new Record LocalDate date new Date 1967 06 22 r setDateOfBirth new Date
  • 如何很好地输出分隔字符串的列表?

    通常 当我必须显示分隔字符串的列表时 我会执行以下操作 using namespace std vector
  • LINQ子查询“NOT IN”问题

    我不明白为什么这个查询失败 var qTags from tagsU in context ADN ProductTagsView where from o in context ADN ProductTagsView where o Pr
  • 如何将数组的内容写入文本文件? C#

    我正在尝试将数组的内容写入文本文件 我已经创建了文件 并将文本框分配给了数组 不确定是否正确 现在我想将数组的内容写入文本文件 Streamwriter 部分是我陷入底部的地方 不确定语法 if File Exists scores txt
  • 什么时候使用哪种指针?

    好吧 上次我以写 C 为生时 std auto ptr所有的标准库都可用吗 boost shared ptr风靡一时 我从未真正研究过 boost 提供的其他智能指针类型 据我所知 C 11 现在提供了 boost 提出的一些类型 但不是全
  • 如何使用 rvest 从 google 搜索中检索标题下方的文本

    这是这个问题的后续问题 如何使用 rvest 从 google 搜索中检索标题 这次我试图在谷歌搜索中获取标题后面的文本 用红色圈出 由于我缺乏网页设计知识 我不知道如何制定 xpath 来提取标题下面的文本 AllanCameron 的答
  • 用于解析 XML 中模板标签的正则表达式

    我需要解析一些 XML 以提取嵌入的模板标签以进行进一步解析 不过 我似乎无法改变 Python 的正则表达式来完成我想要的事情 英文 当行中的任何位置包含模板标记时 删除该特定行的所有 XML 只保留模板标记在其位置 我整理了一个测试用例
  • 为菜谱 #2 创建 Django 模型

    这是一个后续问题为菜谱创建 Django 模型 我可以为单个食谱选择多种成分 但我的代码只允许选择与所有所选成分相关联的一般数量选择 例如 BLT 食谱 我可以选择培根 生菜和番茄 但我无法为每种食材选择不同的数量 即培根 1 生菜 1 番
  • 如何获取gatsby布局文件中的路径名

    我正在与gasby这里的主文件始终是layout js这是他们所有人的父母 既然它是父文件那么我怎样才能获得位置道具this props location pathname在里面 这是我的布局组件 class Layout extends
  • 如何保证序列化世界中的Java实例控制(没有枚举)?

    在 Java 1 5 之前的世界中 所以没有enum 并且当我的对象被序列化时 我如何强制执行正确的实例控制 我正在谈论这样的类 据我所知 我不确定instance0和instance1将始终是唯一的实例 import java io Se
  • Java 查找数组中最小和第二小的值

    我正在尝试创建两种方法 一种方法用于查找对象数组中的最小值 另一种方法用于查找对象数组中的第二个最小值 我这样写了两个 public static BanffMarathonRunner getFastestTime BanffMarath
  • 找到两个嵌套列表的交集?

    我知道如何获得两个平面列表的交集 b1 1 2 3 4 5 9 11 15 b2 4 5 6 7 8 b3 val for val in b1 if val in b2 or def intersect a b return list se
  • jQuery UI DatePicker 仅显示月份年份

    我正在使用 jQuery 日期选择器在我的应用程序中显示日历 我想知道是否可以用它来显示月份和年份 2010 年 5 月 而不是日历 这是一个 hack 用整个 html 文件更新
  • MySQL 内连接帮助 - 想要包含不匹配的行

    我有几张表要加入查找 PET id owner id pet name size 1 1 Sparky L 2 1 Spot L 3 3 FooFoo M 4 3 Barky L 5 3 Jeb S OWNER id owner name
  • Haskell Posix 中的多行匹配

    我似乎找不到关于 haskell 的 POSIX 实现的像样文档 具体模块Text Regex Posix 谁能指出我在字符串上使用多行匹配的正确方向 好奇者的一个片段 gt extractToken body body
  • json 路径表达式在没有数组的情况下不起作用

    我正在尝试实现一个看似简单的 JSON 路径过滤器 但未能使其正常工作 想知道其他对 Json NET 的 JSON 路径实现有更多经验的人是否对后续步骤有想法 这种情况失败了 但我认为应该可行 var jsonText event dat