Search code examples
jsonjqjmespath

JSON parsing using String Condition with JMESPATH


I am facing an issue with parsing a json using Jmespath based on a string condition. I would want to get values of a key based on condition on string value of another key. Both of them are in same hierarchy of a given dictionary. However , the parent key of the dictionary is a variable.I am familiar with jq but jmespath is new to me. I am using it , as the current project depends on it. Hence no much choice on changing the parser.

Sample Json below :-

{
  "people": {
    "a": {"First":"James", "last": "1"},
    "b": {"First":"Jacob", "last": "2"},
    "c": {"First":"Jayden", "last": "3"},
    "d": {"First":"different", "last" : "4"}
  }
}

I would want to get the last's value where First's value starts with "J".

I have tried referring to articles provided in official site at http://jmespath.org/tutorial.html. However , most of them concentrate on a standard key structure and not much on a variable key dictionary structure. Hence am unable to write a jmespath query for a given json.

The jq equivalent for achieving the intended result is given below :-

.people | .[] | select (.First | startswith("J")) | .last

The closest jmespath query , that I could logically arrive at based on my understanding is :-

people.*[?starts_with(First,`J`)].last

However , the above query returns blank result.

Expected output is

 "d","e","f"

I am unable to understand where I am going wrong. It would be nice if someone can point me to a good article or help me find the solution to the above issue.

Thanks alot


Solution

  • UPDATE :

    The solution is to use values(@).

    Reference link https://github.com/jmespath/jmespath.site/issues/24

    So one of the possible solution for the above ask is

    people.values(@)[?starts_with(First,`J`)].last
    
    

    So for any variable key , we can use values(@) to filter projections further down the structure.