You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart json_path库过滤单个对象失效,仅数组生效求助

解决方法 & 原因

问题核心是:[?@.price < 20]是数组专用的过滤断言语法,只能在数组节点上下文里生效,直接用在单个对象上会被忽略。

给两种修正方案,选哪种都行:

方案1:调整路径,在父节点层面判断

把断言放到父节点store下,判断auto的属性,然后返回auto对象:

// 替换原来的路径
JsonPath(r'$.store[?@.auto.price < 20].auto').readValues(docObject)

方案2:把单个对象转为虚拟数组上下文

用[]把单个对象节点包装成数组上下文,这样就能复用数组过滤语法:

// 替换原来的路径
JsonPath(r'$.store.[auto][?@.price < 20]').readValues(docObject)

修正后的完整示例

import 'dart:convert';

import 'package:json_path/json_path.dart';

void main() {
  final docArray = jsonDecode('''
{
  "store": {
     "auto":    
     [  
      {
      "price": 10
    }  
    ]
  }
}    ''');

  final docObject = jsonDecode('''
{
  "store": {
     "auto":     
      {
      "price": 10
    }  
  }
}    ''');

  print('\nauto Object(方案1):');
  JsonPath(r'$.store[?@.auto.price < 20].auto').readValues(docObject).forEach(print);

  print('\nauto Object(方案2):');
  JsonPath(r'$.store.[auto][?@.price < 20]').readValues(docObject).forEach(print);

  print('\nauto Array:');
  JsonPath(r'$.store.auto[?@.price < 20]').readValues(docArray).forEach(print);
}

修正后输出

auto Object(方案1):
{price: 10}

auto Object(方案2):
{price: 10}

auto Array:
{price: 10}
Process finished with exit code 0

内容的提问来源于stack exchange,提问作者Marino Segnan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:47:12