I recommend you break your match into 2 steps to avoid over-complicating things:

```
* def response = [{ a: 1, b: null, c: 2 }, { a: 2, b: [x, y, z], c: 3 }]
* match each response contains { b: '#present' }
* match each response == { a: '#number', b: '##array', c: '#number' }
```

You can combine a "marker" and a "self" reference - see the last example here: https://github.com/intuit/karate#self-validation-expressions

```
* match each response == { a: '#number', b: '##array? _ != null', c: '#number' }
```

For completeness, here is another option. Note that the `isValid()`

function is re-usable, and needs to be defined (globally) only once.

```
* def isValid = function(x){ return !x || karate.match(x, '#array').pass }
* match each response == { a: '#number', b: '#? isValid(_)', c: '#number' }
```