jmespath.py
jmespath.py copied to clipboard
Differentiate between missing values and null values
I'm trying to do a search like:
from jmespath import search
data = {
"grid": [
{"col1": "a", "col2": None},
{"col1": "b", "col2": None},
{"col1": "c", "col2": "x"},
{"col1": "d", "col2": "y"},
]
}
col1_data = search("grid[*].col1", data) # gets ["a", "b", "c", "d"]
col2_data = search("grid[*].col2", data) # gets ["x", "y"], expecting [None, None, "x", "y"]
If the col2
element did not exist, I think the current behavior makes sense. However, I think that search
by default shouldn't also do filtering.
For reference: https://github.com/jmespath/jmespath.py/blob/599b0f7ea650a60f7512233301e70ff8151de0f0/jmespath/visitor.py#L134-L138 https://github.com/jmespath/jmespath.py/blob/599b0f7ea650a60f7512233301e70ff8151de0f0/jmespath/visitor.py#L279-L280
Thoughts ?
Just came across this myself. Would a PR be welcome?
@zalmane @ntextreme3 you might be interested to learn that JMESPath Community supports this scenario - albeit currently in an indirect way.
@zalmane @ntextreme3 you might be interested to learn that JMESPath Community supports this scenario - albeit currently in an indirect way.
That's completely different that what the OP asked...
The questions was how search can support None values as well, currently they are discarded.
That's completely different that what the OP asked... The questions was how search can support None values as well, currently they are discarded.
Hum 🤔 then maybe I’m missing something…
search( map(&col2, grid), data )
-> [ null, null, "x", "y" ]
If you need more downstream processing, you can definitely distinguish between missing values vs null
values by converting them temporarily for processing:
map(&col2 && col2 || 'value-was-null', grid)
-> [ "value-was-null", "value-was-null", "x", "y" ]
Sure, this is kludgey, but that is definitely something that’s possible today.