Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
494 views
in Technique[技术] by (71.8m points)

json - Is it possible to do nested search in jsonpath-ng?

Source "mapping.json":

{
  "result": {
    "src_color": "test_rule_2"
  },
  "rules": {
    "color_degree": {
      "test_rule_1": {
        "color": 1
      },
      "test_rule_2": {
        "color": 2
      }
    }
  }
}

So it works perfectly:

with open("mapping.json", 'r') as json_file:
    mapping = json.load(json_file)

expression = parse('$.rules.color_degree.test_rule_2.color')
match = expression.find(mapping)

if match:
    pprint(match[0].value)

but in the path "test_rule_2" I need to replace with the value from result->src_color

How to properly describe something like this:

expression = parse('$.rules.color_degree.($.result.src_color.value).color')
question from:https://stackoverflow.com/questions/65952517/is-it-possible-to-do-nested-search-in-jsonpath-ng

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

If I understand your question correctly, it can be done, but you need two steps:

#first: get the variable:
src_expression = parse('$.result.src_color')
src_match = src_expression.find(mapping)

#second: get the target
expression = parse(f'$.rules.color_degree.{src_match[0].value}.color')
match = expression.find(mapping)
if match:
    print(match[0].value)

Output is 2.

EDIT:

I don't know why someone would want to do it in one step, but it's possible:

parse(f'$.rules.color_degree.{parse("$.result.src_color").find(mapping)[0].value}.color').find(mapping)[0].value

Same output.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...