JSONPath核心语法与Python实战:高效查询复杂JSON数据
1. 从XML到JSON为什么我们需要JSONPath如果你处理过XML数据大概率听说过XPath。它是一种用于在XML文档中定位节点的查询语言功能强大但语法也相对复杂。随着JSON格式在Web API、配置文件和数据交换中几乎成为事实标准我们处理JSON数据的频率远高于XML。但当你面对一个嵌套了七八层、结构复杂的JSON对象时如何快速、精准地提取出你需要的那个值用Python一层层写dict.get()或者[]吗那代码会变得冗长且脆弱一旦数据结构稍有变动修改起来就是一场灾难。这就是JSONPath登场的时候。简单来说JSONPath之于JSON就如同XPath之于XML。它提供了一种简洁、声明式的语法让你能用一条类似路径的表达式直接从复杂的JSON结构中“导航”到你想要的数据节点。无论是提取所有符合条件的元素还是进行条件过滤JSONPath都能极大地提升代码的简洁性和可维护性。今天我们就来彻底搞懂JSONPath的基本语法并通过大量Python实战示例让你能立刻在项目里用起来。2. JSONPath核心语法全解从根节点到通配符JSONPath表达式总是以特定的符号开头指向JSON结构的某个起始点然后通过一系列操作符来“步进”到目标位置。理解这些基本构件是写出正确表达式的关键。2.1 起点根节点与当前节点所有的查询都有一个起点。JSONPath定义了两种起始标识符$ 代表根节点。这是绝大多数JSONPath表达式的起点。你可以把它想象成文件系统的根目录/。 代表当前节点。这个符号主要用于过滤器表达式的上下文中表示正在被过滤判断的那个节点本身。在简单的路径导航中不常用。例如对于一个JSON对象{store”: {...}}表达式$.store就是从根节点$出发访问其名为”store”的子节点。2.2 导航操作符如何“走”到数据面前确定了起点我们就要在JSON的层次结构中移动。主要有三种操作符点号. 用于访问对象的属性键。这是最常用的操作符。示例$.store.book表示访问根节点下store对象里的book属性。方括号[] 功能最丰富的操作符有几种用途访问对象属性当属性名包含特殊字符如空格、连字符或以数字开头时必须使用方括号和引号。例如$[‘store-book’]。访问数组索引用于访问数组中的特定元素。索引从0开始。示例$.store.book[0]获取book数组的第一本书。支持负数索引$.store.book[-1]获取最后一本书。切片操作类似于Python列表切片格式为[start:end:step]。end索引不包含在内。示例$.store.book[0:3]获取前3本书索引0, 1, 2。示例$.store.book[::2]获取所有索引为偶数的书。通配符* 在对象中匹配所有属性名在数组中匹配所有元素。示例$.store.*获取store对象下的所有直接子节点的值可能包括book数组、bicycle对象等。示例$.store.book[*].title获取所有书的标题。递归下降符.. 这是一个非常强大的操作符它会在当前节点及其所有后代节点中进行深度搜索找到所有匹配名称的节点而不管它们嵌套得多深。示例$..author会在整个JSON文档中搜索所有名为”author”的字段并返回它们的值。这比写复杂的嵌套路径方便得多。2.3 过滤器表达式进行条件筛选这是JSONPath的精华所在允许你进行条件查询。过滤器写在方括号[?()]中里面是一个布尔表达式。基本语法[?(expression)]操作数代表当前正在被处理的节点。可以使用属性名直接访问当前节点的子属性。操作符支持常见的比较操作符,!,,,,逻辑操作符,||,!以及正则表达式匹配~。示例$.store.book[?(.price 10)]找出所有价格低于10的书籍。$.store.book[?(.category ‘fiction’ .price 12)]找出类别为fiction且价格高于12的书籍。$..book[?(.author ~ /.*REES/i)]使用正则表达式找出作者名以REES结尾不区分大小写的所有书籍。2.4 脚本表达式与联合路径脚本表达式在一些JSONPath实现中如Jayway的Java实现可以在[()]中嵌入脚本。但在Python的jsonpath-ng等库中通常更推荐使用过滤器表达式功能足够且更标准。联合路径使用逗号,可以在一个表达式中指定多个路径。示例$.store.book[0,2,4]获取第1、3、5本书。示例$.store.book[?(.price 10), ?(.isbn)]获取价格低于10的书和有ISBN号的书的并集。为了更直观地理解这些语法如何作用于一个复杂的JSON我们假设有如下数据一个简化版的商店数据{ “store”: { “book”: [ { “category”: “reference”, “author”: “Nigel Rees”, “title”: “Sayings of the Century”, “price”: 8.95 }, { “category”: “fiction”, “author”: “Evelyn Waugh”, “title”: “Sword of Honour”, “price”: 12.99 }, { “category”: “fiction”, “author”: “Herman Melville”, “title”: “Moby Dick”, “isbn”: “0-553-21311-3”, “price”: 8.99 }, { “category”: “fiction”, “author”: “J. R. R. Tolkien”, “title”: “The Lord of the Rings”, “isbn”: “0-395-19395-8”, “price”: 22.99 } ], “bicycle”: { “color”: “red”, “price”: 19.95 } } }下表展示了不同JSONPath表达式应用于上述数据的结果JSONPath 表达式说明返回结果示例$.store.book[*].author获取所有书的作者[“Nigel Rees”, “Evelyn Waugh”, …]$..author递归获取所有作者[“Nigel Rees”, “Evelyn Waugh”, …]$.store.*store下的所有直接子节点[ [book数组], {bicycle对象} ]$.store..pricestore下所有后代节点中的price值[8.95, 12.99, 8.99, 22.99, 19.95]$..book[2]递归找到所有book数组取第三个元素[{“category”: “fiction”, “author”: “Herman Melville”, …}]$..book[-2]递归找到所有book数组取倒数第二个元素[{“category”: “fiction”, “author”: “Herman Melville”, …}]$..book[0:2]递归找到所有book数组取前两个元素[{第一本书}, {第二本书}]$..book[?(.isbn)]递归找到所有有isbn字段的书[{第三本书}, {第四本书}]$.store.book[?(.price 10)]store.book中价格低于10的书[{第一本书}, {第三本书}]$..book[?(.category ‘fiction’ .price 12)]递归找到类别为fiction且价格12的书[{第二本书}, {第四本书}]$..*递归获取所有节点慎用数据量大整个JSON结构的所有值3. 在Python中实战主流库jsonpath-ng详解Python中有几个JSONPath库如jsonpath、jsonpath-ng。我个人更推荐jsonpath-ng因为它功能更完整更贴近标准的JSONPath语法且支持扩展。我们通过pip安装pip install jsonpath-ng。3.1 基础用法解析与查找jsonpath-ng的核心是parse函数和find方法。from jsonpath_ng import parse # 示例JSON数据 (使用上面store的数据这里用Python字典表示) data { “store”: { “book”: [ {“category”: “reference”, “author”: “Nigel Rees”, “title”: “Sayings of the Century”, “price”: 8.95}, {“category”: “fiction”, “author”: “Evelyn Waugh”, “title”: “Sword of Honour”, “price”: 12.99}, {“category”: “fiction”, “author”: “Herman Melville”, “title”: “Moby Dick”, “isbn”: “0-553-21311-3”, “price”: 8.99}, {“category”: “fiction”, “author”: “J. R. R. Tolkien”, “title”: “The Lord of the Rings”, “isbn”: “0-395-19395-8”, “price”: 22.99} ], “bicycle”: {“color”: “red”, “price”: 19.95} } } # 1. 解析JSONPath表达式 jsonpath_expr parse(“$.store.book[*].author”) # 2. 在数据上执行查找 matches jsonpath_expr.find(data) # 3. 处理结果 # matches 是一个Match对象的列表 for match in matches: print(f”Path: {match.path}”) # 访问匹配到的路径 print(f”Value: {match.value}”) # 访问匹配到的值 # 直接获取所有值 authors [match.value for match in matches] print(authors) # 输出: [‘Nigel Rees’, ‘Evelyn Waugh’, ‘Herman Melville’, ‘J. R. R. Tolkien’]match.value就是你想要的数据。match.path显示了该值在JSON中的完整路径这在调试复杂表达式时非常有用。3.2 处理查找结果空值与多匹配在实际应用中你的表达式可能匹配不到任何内容或者匹配到多个内容。# 可能无匹配的表达式 jsonpath_expr_no_match parse(“$.store.magazine[*].title”) matches jsonpath_expr_no_match.find(data) if matches: print(“Found:”, [m.value for m in matches]) else: print(“No matches found.”) # 会执行这里 # 获取单个值当确信只有一个匹配时 # 方法一取第一个匹配 jsonpath_expr_single parse(“$.store.bicycle.color”) matches jsonpath_expr_single.find(data) if matches: color matches[0].value print(f”Bicycle color: {color}”) # 输出: Bicycle color: red # 方法二更安全使用列表推导式结果为空列表也无妨 colors [match.value for match in parse(“$.store.bicycle.color”).find(data)] if colors: print(f”Bicycle color: {colors[0]}”)注意永远不要假设你的JSONPath表达式一定能匹配到数据。特别是在处理来自外部API或用户输入的JSON时务必对find的结果进行判空处理否则直接访问matches[0]可能会引发IndexError。3.3 实现更复杂的过滤与计算jsonpath-ng的过滤器支持比较丰富的表达式我们可以实现复杂的查询。# 找出所有价格低于10元的书籍标题 cheap_books_expr parse(“$.store.book[?(.price 10)].title”) cheap_titles [match.value for match in cheap_books_expr.find(data)] print(“Cheap books:”, cheap_titles) # 输出: [‘Sayings of the Century’, ‘Moby Dick’] # 找出有ISBN号且类别是fiction的书籍作者 filtered_expr parse(“$.store.book[?(.isbn .category ‘fiction’)].author”) filtered_authors [match.value for match in filtered_expr.find(data)] print(“Authors with ISBN (fiction):”, filtered_authors) # 输出: [‘Herman Melville’, ‘J. R. R. Tolkien’] # 使用递归下降符查找整个文档中所有的price all_prices_expr parse(“$..price”) all_prices [match.value for match in all_prices_expr.find(data)] print(“All prices:”, all_prices) # 输出: [8.95, 12.99, 8.99, 22.99, 19.95]4. 避坑指南与性能考量真实项目中的经验谈纸上谈兵终觉浅在实际项目中使用JSONPath我踩过一些坑也总结了一些最佳实践。4.1 常见陷阱与错误排查属性名包含特殊字符或数字这是新手最容易出错的地方。如果JSON的键名包含点.、空格、连字符-或以数字开头必须使用方括号和引号。# 错误示例 data {“first-name”: “John”, “1st”: “first”} # parse(“$.first-name”) # 解析失败-会被解析为减号操作 # parse(“$.1st”) # 解析失败数字开头 # 正确示例 expr_correct1 parse(“$[‘first-name’]“) expr_correct2 parse(“$[‘1st’]“)过滤器表达式中的字符串比较在过滤器?(.key ‘value’)中等号右边的字符串必须使用单引号。双引号在JSONPath表达式字符串中会引起冲突。# 正确 expr parse(“$.store.book[?(.category ‘fiction’)]“) # 错误在Python字符串中会导致转义问题 # expr parse(“$.store.book[?(.category \”fiction\”)]“)递归下降符..的性能$..key非常方便但它会遍历整个JSON子树。如果JSON结构非常庞大且嵌套很深这个操作可能会比较耗时。在明确知道数据位置时尽量使用精确路径如$.a.b.c.key。返回结果的类型jsonpath_ng.find()返回的是Match对象的列表。你需要通过.value来获取实际数据。如果路径指向一个对象或数组.value返回的就是那个字典或列表。4.2 性能优化建议对于小型配置或API响应几百KB以内JSONPath的性能开销可以忽略不计。但在处理大型JSON日志文件或数据流时几MB到几十MB就需要考虑效率。预编译表达式如果你需要反复在多个JSON数据上执行同一个JSONPath查询一定要预编译表达式。# 好的做法编译一次重复使用 expensive_expr parse(“$..transactions[?(.amount 1000 .currency ‘USD’)].id”) for json_chunk in large_data_stream: results expensive_expr.find(json_chunk) # … 处理结果 # 差的做法在循环中重复解析 for json_chunk in large_data_stream: results parse(“$..transactions[?(.amount 1000)].id”).find(json_chunk) # 每次循环都解析低效避免过度使用通配符*和递归..在可能的情况下让路径更具体。$.records[*].data.field通常比$..field更快因为后者搜索范围更大。考虑替代方案对于超大型JSONGB级别或对延迟极其敏感的场景如果查询模式固定且简单手动遍历字典或使用ijson这类流式解析库提取特定键值可能是更高效的选择。JSONPath提供了便利性但抽象总会带来一些开销。4.3 与Python原生操作的对比什么时候该用JSONPath什么时候用Python原生语法使用JSONPath当查询路径复杂、嵌套深。查询条件动态变化例如由用户输入或配置文件指定查询条件。你需要进行“递归查找”..或“通配符匹配”*用原生语法写循环会很麻烦。你想让数据提取的逻辑更清晰、更声明式与业务代码解耦。直接使用Python原生语法当路径非常简单且固定例如data[‘user’][‘name’]。你需要对提取过程进行非常精细的控制或复杂的异常处理。你处理的不是标准的字典/列表结构或者需要与特定的对象模型交互。一个实用的混合模式在配置文件中定义复杂的JSONPath查询规则在代码中加载并编译这些规则然后应用于数据。这样当数据提取逻辑需要变更时你只需修改配置文件而无需改动代码。5. 实战进阶动态构建查询与结果处理JSONPath的真正威力在于其动态性。我们很少会把查询语句硬编码在代码里。5.1 动态构建查询表达式假设我们有一个系统允许用户根据多个字段动态过滤产品数据。def build_jsonpath_query(filters): “”” 根据过滤条件字典动态构建JSONPath表达式。 filters 格式: {‘field1’: {‘op’: ‘’, ‘value’: 10}, ‘field2’: {‘op’: ‘’, ‘value’: ‘active’}} “”” conditions [] for field, rule in filters.items(): op rule[‘op’] val rule[‘value’] # 处理字符串值需要加引号 if isinstance(val, str): val_str f”‘{val}’” else: val_str str(val) if op ‘’: cond f”.{field} {val_str}” elif op ‘’: cond f”.{field} {val_str}” elif op ‘’: cond f”.{field} {val_str}” elif op ‘~’: # 正则匹配 cond f”.{field} ~ /{val}/” else: continue conditions.append(cond) if not conditions: return “$[*]” # 无条件则返回所有 # 用 AND 连接所有条件 filter_str ‘ ‘.join(conditions) jsonpath_str f”$[?({filter_str})]“ return jsonpath_str # 使用示例 user_filters { ‘price’: {‘op’: ‘’, ‘value’: 20}, ‘category’: {‘op’: ‘’, ‘value’: ‘fiction’} } dynamic_expr_str build_jsonpath_query(user_filters) print(“Generated JSONPath:”, dynamic_expr_str) # 输出: $[?(.price 20 .category ‘fiction’)] jsonpath_expr parse(dynamic_expr_str) filtered_data [match.value for match in jsonpath_expr.find(data[‘store’][‘book’])] print(“Filtered books:”, filtered_data)5.2 处理复杂的返回结构并更新数据jsonpath-ng不仅能查找还能通过match对象定位到数据的具体位置进而实现更新或删除。# 假设我们想给所有价格低于10元的书打九折 discount_expr parse(“$.store.book[?(.price 10)]“) for match in discount_expr.find(data): # match.full_path 给出了数据位置的“路径对象”我们可以用它来更新 # 但直接修改 match.value 是无效的因为那是副本。 # 我们需要使用 update 方法如果实现支持或通过路径定位。 # jsonpath-ng 的 Match 对象提供了 path但直接赋值给 match.value 不改变原数据。 # 更实用的方法是先找到再通过标准字典操作更新。 # 这里演示一个通过路径查找再更新的思路简化版实际需遍历路径 book match.value # 这是字典的引用吗在jsonpath-ng中match.value是数据的“副本”或“视图”吗需要测试。 # 经过测试对于列表中的字典match.value是原始数据的引用可以直接修改 book[‘price’] round(book[‘price’] * 0.9, 2) print(f”Updated {book[‘title’]} price to {book[‘price’]}”) print(“First book price after discount:”, data[‘store’][‘book’][0][‘price’])重要提示关于match.value是否是引用取决于jsonpath-ng的内部实现和数据结构。对于列表中的可变对象如字典修改match.value通常能生效。但对于不可变对象如字符串、数字或通过某些操作符如递归..找到的节点行为可能不同。最保险的做法是如果你需要修改原始数据最好记录下路径或索引然后通过标准的Python赋值语句如data[‘store’][‘book’][0][‘price’] new_value进行操作。JSONPath是一个强大而优雅的工具它将你从繁琐的层级访问代码中解放出来。掌握其核心语法和jsonpath-ng库的使用能让你在处理JSON数据时事半功倍。记住对于简单固定的访问用原生语法对于复杂、动态或声明式的查询JSONPath是你的不二之选。在下次面对一团乱麻的JSON时不妨先想想“能不能用一条JSONPath搞定”

相关新闻

HarmonyOS 7 / API 26 ArkWeb 文件上传适配:内核差异、权限边界和失败兜底一次验清

HarmonyOS 7 / API 26 ArkWeb 文件上传适配:内核差异、权限边界和失败兜底一次验清

HarmonyOS 7 / API 26 里用 ArkWeb 承载 H5 页面时&#xff0c;文件上传是一个很容易被低估的适配点。H5 页面里一个普通的 <input type"file">&#xff0c;在桌面浏览器里基本不会出问题&#xff0c;但放进应用之后&#xff0c;就会遇到权限、文件类型、回调生…

2026/8/5 4:09:46 阅读更多 →
数据分析师必备:从SQL取数到业务洞见的全流程实战指南

数据分析师必备:从SQL取数到业务洞见的全流程实战指南

1. 项目概述&#xff1a;从“取数”到“洞见”的实战之路在数据驱动的商业世界里&#xff0c;“取数”是数据分析师和数据工程师最日常、也最核心的工作之一。听起来简单&#xff0c;不就是写个SQL从数据库里把数拿出来吗&#xff1f;但真正在一线干过的人都知道&#xff0c;这…

2026/8/5 4:09:46 阅读更多 →
C++之模板进阶

C++之模板进阶

1 非类型模板参数 模板参数分为类型形参和非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 例: template<class T1,typename T2> class A { public:A(){printf("A<T1,T2>\n");}…

2026/8/5 4:08:45 阅读更多 →

最新新闻

【金仓数据库征文】200 万行订单表调优实录:KingbaseES V9R1C10 执行计划分析与索引优化

【金仓数据库征文】200 万行订单表调优实录:KingbaseES V9R1C10 执行计划分析与索引优化

摘要上两篇写了部署和 AI 直连。这篇调优。200 万行,报表慢。我造了 200 万行,揪出慢查询,sys_hypo 试水,再落地索引。region 查询 655.9→181.9 ms。amount 查询 583.4→257.4 ms。复合索引 174.9→42.7 ms。大排序 6.3 秒→2.5 秒。数字全是机器跑的,截图在下边。一、为什么调…

2026/8/5 7:49:23 阅读更多 →
Kerberos协议深度解析:从核心原理到企业级部署实战

Kerberos协议深度解析:从核心原理到企业级部署实战

1. 项目概述&#xff1a;为什么我们需要Kerberos&#xff1f;在分布式系统和大型企业网络里&#xff0c;身份认证是个老大难问题。想象一下&#xff0c;你每天上班要登录邮箱、访问文件服务器、连接数据库&#xff0c;如果每个系统都让你输一遍用户名密码&#xff0c;不仅麻烦&…

2026/8/5 7:49:23 阅读更多 →
Bearer Token 认证详解:从 HTTP 认证演进到 JWT 实战应用

Bearer Token 认证详解:从 HTTP 认证演进到 JWT 实战应用

1. 从一次调试说起&#xff1a;Authorization头里的Bearer前缀 那天下午&#xff0c;我正在排查一个棘手的API调用问题。客户端日志里清晰地打印着请求头&#xff1a; Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp... &#xff0c;一个标准的JWT令牌。服务器端却固执地返…

2026/8/5 7:49:23 阅读更多 →
OCP(过流保护)从入门到精通

OCP(过流保护)从入门到精通

一文搞懂 OCP&#xff08;过流保护&#xff09;&#xff1a;是什么、哪些芯片有、怎么区分、还需不需要其他保护器件&#xff1f; 在硬件设计领域&#xff0c;OCP&#xff08;Over Current Protection&#xff0c;过流保护&#xff09; 是电源和功率电路中绕不开的话题。很多工…

2026/8/5 7:49:23 阅读更多 →
中小企业通信选型:公司用什么邮箱比较好,开通企业邮箱运维实操方案

中小企业通信选型:公司用什么邮箱比较好,开通企业邮箱运维实操方案

在企业信息化架构搭建中&#xff0c;企业邮箱承担商务函件传输、业务数据留存、内外协同沟通等重要作用。不少运维、行政人员常会思考&#xff1a;公司用什么邮箱比较好&#xff0c;如何标准化开通企业邮箱。本文从运维落地视角&#xff0c;讲解企业邮箱注册流程、企业邮箱安全…

2026/8/5 7:49:23 阅读更多 →
Windows右键菜单终极清理指南:ContextMenuManager让你的右键菜单重获新生

Windows右键菜单终极清理指南:ContextMenuManager让你的右键菜单重获新生

Windows右键菜单终极清理指南&#xff1a;ContextMenuManager让你的右键菜单重获新生 【免费下载链接】ContextMenuManager &#x1f5b1;️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否厌倦了每次右键点击文…

2026/8/5 7:48:23 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架&#xff0c;为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能&#xff0c;同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求&#xff1a;通孔焊盘 十字花&#xff1b;过孔 Via 实心直连&#xff1b;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑&#xff1a;全部统一十字&#xff0c;导致接地过孔阻抗高、大电流发热&#xff01; 一、快捷键打开规则 PCB 界面按下&#xff1a;D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用&#xff0c;其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流&#xff1a;一个核心问题的诞生想象一下&#xff0c;你是一个城市供水系统的总工程师。你的城市有多个水源&#xff08;水库&#xff09;&#xff0c;需要通过一个复杂的地下管道网络&#xff0c;将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起&#xff1a;为什么我们需要互相关几年前&#xff0c;我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号&#xff0c;理论上它们接收到的声音波形应该非常相似&#xff0c;只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →