当前位置: 首页 > news >正文

C#怎么操作JSON路径查询 C#如何用JsonPath或System.Text.Json查询嵌套JSON数据【技巧】

JsonPath 不是 System.Text.Json 原生功能,需依赖 Newtonsoft.Json 等第三方库;手动遍历 JsonElement 要用 TryGetProperty 和类型检查防崩溃;固定路径应优先使用强类型反序列化而非 JsonPath。JsonPath 在 C# 里根本不是 .NET 原生支持的System.Text.Json 自带的 JsonElement 和 JsonProperty 没有内置 JsonPath 解析能力。你写 $..name 或 $.data[?(@.age > 30)],直接报错——它压根不认识这语法。想用 JsonPath,必须引入第三方库,最常用的是 Newtonsoft.Json(即 Json.NET)搭配 JToken.SelectTokens();或者用轻量替代方案 Manatee.Json 或 JsonPath.Net。但注意:System.Text.Json 本身不提供 SelectTokens,别在官方文档里白找。如果你项目已用 Newtonsoft.Json,直接上 JObject.Parse(json).SelectTokens("path")如果坚持用 System.Text.Json,只能手动遍历 JsonElement,或封装递归查找逻辑(比如匹配字段名、数组索引、简单条件)混合使用两种解析器容易出问题:比如把 JsonElement 强转成 JToken 会抛 InvalidOperationExceptionSystem.Text.Json 手动查嵌套字段怎么写才不崩没有 JsonPath,就得靠 GetProperty() 和 EnumerateArray() 一层层钻。关键不是“能不能”,而是“怎么避免空引用崩溃”和“路径不存在时安静失败”。比如查 $.store.book[0].author,不能连写 root.GetProperty("store").GetProperty("book")[0].GetProperty("author")——中间任意一环为 null 或类型不对(比如 "book" 是字符串不是对象),立刻炸。永远用 TryGetProperty("xxx", out var result) 替代 GetProperty()数组访问前先确认是 JsonValueKind.Array,再用 EnumerateArray() 遍历,别硬用 [0]类型检查不能少:取值前用 result.ValueKind == JsonValueKind.String 判断,否则 result.GetString() 可能返回 null 而非抛异常路径深了建议写个辅助方法,传入 JsonElement 和 string[] path,逐段 TryGetPropertyNewtonsoft.Json 的 SelectTokens 性能和坑点SelectTokens 写起来爽,$.items[*].price 一行搞定,但它不是零成本魔法。底层要构建 AST、遍历整棵树,对大 JSON(>1MB)或高频调用场景,比手写 GetProperty 慢 3–5 倍。更麻烦的是语义陷阱:比如 $..id 默认深度优先遍历所有层级,可能返回意外的嵌套字段;[?(@.status == 'active')] 中字符串比较默认区分大小写,而 System.Text.Json 默认不支持这种表达式。用 SelectTokens 前先 JObject.Parse(json),别反复解析同一份 JSON 字符串过滤表达式里避免复杂逻辑,[?(@.x > @.y)] 这种跨字段比较在某些版本会静默失败结果是 IEnumerable<jtoken></jtoken>,别直接 .ToList() 存着——JToken 是引用,原 JObject 被 GC 后它就失效若只取第一个匹配项,用 SelectToken(单数)比 SelectTokens(复数)略快且语义更明确什么时候该放弃 JsonPath,改用序列化模型如果你查的路径是固定的(比如总要取 response.data.items[].name),而且结构稳定,硬写 JsonPath 或手动遍历反而增加维护成本。这时候直接定义 C# 类,用 System.Text.Json.JsonSerializer.Deserialize<t>()</t> 更安全、更快、IDE 还能补全。JsonPath 真正有用,是当路径来自配置、用户输入或需要动态拼接时——比如 API 返回结构不统一,靠字段名开关控制提取逻辑。模型类字段加 [JsonPropertyName("api_field_name")] 处理命名差异不确定是否存在字段,用 string? 或可空类型(如 int?),反序列化自动为 null嵌套数组用 List<t></t>,别用 T[] ——后者反序列化失败时不报错,而是整个对象为 null别为了“灵活”把所有字段都定义成 JsonElement,那等于放弃了类型安全和性能优势真正难的从来不是怎么写路径表达式,而是判断:这个查询到底是临时调试用,还是会长期嵌在业务逻辑里。后者几乎总是该收进模型类。

http://www.jsqmd.com/news/683563/

相关文章:

  • 当你的训练数据有‘偏见’:用Concept Bottleneck Models(CBM)构建更鲁棒的分类器
  • 如何在降AI的同时保持论文原意:深度改写模式使用技巧教程
  • 如何5分钟搭建Steam清单自动下载系统:Onekey终极指南
  • 手把手教你用pvresize解决LVM容量显示不准的坑(附RHEL/CentOS 7/8实战)
  • 无代码开发公司哪家好?无代码开发公司推荐!
  • 如何使用Navicat连接云端MariaDB_白名单与实例配置
  • 从B站缓存到永久收藏:m4s-converter终极转换指南
  • 硬件工程师避坑指南:VL817S与VL817B0/C0原理图设计差异详解(附参考设计)
  • 新手避坑指南:从零组装一台四轴无人机,如何选对电机、电调和螺旋桨?
  • ArduPilot开源飞控之AP_Baro:从启动校准到多传感器融合的高度解算
  • 企业级向量应用架构设计(含混合检索Fallback策略、Token预算动态熔断、向量版本灰度发布机制)
  • Cadence Virtuoso入门实战:手把手教你用AMI 0.6u工艺完成一个与非门(附DRC/LVS避坑指南)
  • 告别动态库依赖:保姆级教程,用Qt 5.15.2 MinGW 32位静态编译打造独立可执行程序
  • 090_因果AI之预测性维护:其概念,其实现原理,其适用的场景,常见的应用,以及未来布局的产业和市场,以及涉
  • CompressO终极指南:5步掌握开源视频压缩工具的高效使用
  • 全国一体化算力网:政策推动资源优化,Token 出海成数字贸易新形态
  • 突破百度网盘限速:如何用pan-baidu-download实现智能高速下载?
  • 环境监测系统中的传感器网络与数据分析
  • 2026军工QMS国产厂商排名,头部品牌核心竞争力解析 - 资讯焦点
  • 深入浅出:TI DSP F2803x高精度HRPWM实战,让你的电源环路控制更精准
  • SuperMap处理Revit/Bentley/IFC格式BIM数据,从导入到发布Web端的避坑指南
  • Agent-Ready 不只是口号!Spring Boot 4.0 官方未公开的3类ClassLoader陷阱,92%开发者已中招,速查修复→
  • Firefox 150.0 发布:功能增强、问题修复,带来多方面更新!
  • 如何在SketchUp中实现STL文件双向导入导出:3D打印必备插件终极指南
  • 如何批量降低多篇论文AI率:同时处理多篇文章的操作完整教程
  • 五一去长沙住哪里玩得比较全,从哪订合适?省心订房看美团,5折好房任你选 - 资讯焦点
  • OLED显示乱码?可能是你的字库取模方式没选对!详解共阴/共阳、列行式/行列式
  • FPGA除法器IP核仿真全流程:从Testbench编写到除数为0异常处理
  • 开源知识库选型指南:PandaWiki为何成为车企技术团队首选
  • 2026 年 AI 算力全面涨价,开发者如何平衡效率与成本?