如何使用jmespath检查json数据中的数组是否为空?

3

我有以下json数据:

[
  {
    "id": "i_1",
    "name": "abc",
    "address": [
      {
        "city": [
          "city1",
          "city2"
        ]
      },
      {
        "city": [
          "city1",
          "city2"
        ]
      }
    ]
  },
  {
    "id": "i_2",
    "name": "def",
    "address": [
      {
        "city": []
      },
      {
        "city": []
      }
    ]
  }
]

现在,我只想获取city数组不为null的数据。因此,在上面的示例中,输出应该是第一个元素,即具有id i_1的元素。
如何使用jmespath库过滤此json
4个回答

4
你可以这样做:

var arr = [
  {
    "id": "i_1",
    "name": "abc",
    "address": [
      {
        "city": [
          "city1",
          "city2"
        ]
      },
      {
        "city": [
          "city1",
          "city2"
        ]
      }
    ]
  },
  {
    "id": "i_2",
    "name": "def",
    "address": [
      {
        "city": []
      },
      {
        "city": []
      }
    ]
  }
];

console.log(jmespath.search(arr,"[?not_null(address[].city[])]"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.js"></script>


0

var arr = [
  {
    "id": "i_1",
    "name": "abc",
    "address": [
      {
        "city": [
          "city1",
          "city2"
        ]
      },
      {
        "city": [
          "city1",
          "city2"
        ]
      }
    ]
  },
  {
    "id": "i_2",
    "name": "def",
    "address": [
      {
        "city": []
      },
      {
        "city": []
      }
    ]
  }
];
console.log(jmespath.search({ c: arr}, "not_null(c[].address[].city[])"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.js"></script>

我不知道你的结果是什么。你能解释得更清楚一点吗?


0

你可以使用纯JavaScript来实现这个,使用filterevery

const items=[{"id":"i_1","name":"abc","address":[{"city":["city1","city2"]},{"city":["city1","city2"]}]},{"id":"i_2","name":"def","address":[{"city":[]},{"city":[]}]}]

const filtered = items.filter(i => i.address.every(a => a.city && a.city.length > 0))

console.log(filtered)

只有当address内的每个对象都具有非空城市数组时才返回。


我想使用jmespath来实现这个,有没有办法用jmespath来做这个? - Monarth Sarvaiya
1
你可以通过将a.city.length > 0简化为a.city.length来简化这个代码。 - Nick Parsons
@MonarthSarvaiya 对不起,我不知道。只是提供了一个替代的JavaScript解决方案。 - adiga

0

你不需要使用jmespath库,可以使用filter和`every`来自原生JS。这样更高效。

let jsonTxt = '{"data":[{"id":"i_1","name":"abc","address":[{"city":["city1","city2"]},{"city":["city1","city2"]}]},{"id":"i_2","name":"def","address":[{"city":[]},{"city":[]}]}]}'

let jsonData = JSON.parse(jsonTxt);
let items = jsonData.data;
const result = items.filter(i => i.address.every(a => a.city && a.city.length))
console.log('id: ', result[0].id);
//using jmespath
console.log(jmespath.search({data: items}, "data[*].address[*].city"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jmespath/0.15.0/jmespath.js"></script>


我正在使用jmespath的其他过滤器,目前遇到了困难,所以我只想使用jmespath来解决问题。这里只是我的代码的一部分。 - Monarth Sarvaiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接