JSONPath ਕੀ ਹੈ?
JSONPath JSON ਦਸਤਾਵੇਜ਼ਾਂ ਲਈ ਇੱਕ ਪੁੱਛਗਿੱਛ ਭਾਸ਼ਾ ਹੈ, XML ਲਈ XPath ਦਾ JSON ਸਮਕੱਖ। Stefan Goessner ਨੇ 2007 ਵਿੱਚ ਇਸਨੂੰ ਇੱਕ ਪਾਰਸਰ ਲਿਖੇ ਬਿਨਾਂ JSON ਟ੍ਰੀ ਦੇ ਅੰਦਰ ਕਿਸੇ ਨੋਡ ਵੱਲ ਇਸ਼ਾਰਾ ਕਰਨ ਦੇ ਇੱਕ ਸੰਖੇਪ, ਪੜ੍ਹਨਯੋਗ ਤਰੀਕੇ ਵਜੋਂ ਪ੍ਰਸਤਾਵਿਤ ਕੀਤਾ। ਇੱਕ ਐਕਸਪ੍ਰੈਸ਼ਨ ਰੂਟ ਸਿਲੈਕਟਰ $ ਨਾਲ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ ਅਤੇ ਪ੍ਰਾਪਰਟੀ ਐਕਸੈੱਸਰ, ਐਰੇ ਸਬਸਕ੍ਰਿਪਟ, ਵਾਈਲਡਕਾਰਡ, ਰਿਕਰਸਿਵ ਡਿਸੈਂਟ, ਅਤੇ ਫਿਲਟਰ ਸ਼ਰਤਾਂ ਨੂੰ ਉਦੋਂ ਤੱਕ ਜੋੜਦਾ ਜਾਂਦਾ ਹੈ ਜਦੋਂ ਤੱਕ ਇਹ ਉਹ ਨੋਡ ਨਹੀਂ ਚੁਣ ਲੈਂਦਾ ਜੋ ਤੁਸੀਂ ਚਾਹੁੰਦੇ ਹੋ। 2024 ਵਿੱਚ IETF ਨੇ ਉਸ ਸਿੰਟੈਕਸ ਨੂੰ ਮਿਆਰੀ ਬਣਾਉਣ ਲਈ RFC 9535 ਪ੍ਰਕਾਸ਼ਿਤ ਕੀਤਾ ਜੋ ਲਾਗੂਕਰਨਾਂ ਵਿੱਚ ਖਿੱਲਰ ਗਿਆ ਸੀ; ਇਹ ਟੈਸਟਰ jsonpath-plus ਉੱਤੇ ਚੱਲਦਾ ਹੈ, ਇੱਕ ਵਿਆਪਕ ਤੌਰ ਤੇ ਵਰਤੀ ਜਾਂਦੀ JavaScript ਲਾਗੂਕਰਨ ਜੋ Goessner ਡਰਾਫਟ, ਜ਼ਿਆਦਾਤਰ RFC 9535, ਅਤੇ ਉੱਪਰੋਂ ਕੁਝ ਐਕਸਟੈਂਸ਼ਨ ਆਪਰੇਟਰਾਂ ਨੂੰ ਕਵਰ ਕਰਦੀ ਹੈ।
JSONPath ਕਿਵੇਂ ਕੰਮ ਕਰਦਾ ਹੈ
ਇੱਕ JSONPath ਐਕਸਪ੍ਰੈਸ਼ਨ ਖੱਬੇ ਤੋਂ ਸੱਜੇ ਪੜ੍ਹਦਾ ਹੈ ਅਤੇ ਇੱਕ JSON ਦਸਤਾਵੇਜ਼ ਵਿੱਚ ਇੱਕ ਵਾਰ ਇੱਕ ਕਦਮ ਚੱਲਦਾ ਹੈ। ਹਰ ਕਦਮ ਉਹਨਾਂ ਨੋਡਾਂ ਦੇ ਸੈੱਟ ਨੂੰ ਲੈਂਦਾ ਹੈ ਜੋ ਪਿਛਲੇ ਕਦਮ ਤੋਂ ਬਚੇ ਅਤੇ ਉਸਨੂੰ ਹੋਰ ਤੰਗ ਕਰਦਾ ਹੈ। ਪੂਰੀ ਮੁਲਾਂਕਣ ਪਾਈਪਲਾਈਨ:
- ਰੂਟ ਸਿਲੈਕਟਰ
$ਨਾਲ ਐਂਕਰ ਕਰੋ। ਹਰ ਐਕਸਪ੍ਰੈਸ਼ਨ ਇੱਥੇ ਸ਼ੁਰੂ ਹੁੰਦਾ ਹੈ, ਟੌਪ-ਲੈਵਲ ਮੁੱਲ ਵੱਲ ਇਸ਼ਾਰਾ ਕਰਦਾ ਹੋਇਆ, ਚਾਹੇ ਉਹ ਇੱਕ ਆਬਜੈਕਟ ਹੋਵੇ ਜਾਂ ਇੱਕ ਐਰੇ। ਮੋਹਰੀ$ਤੋਂ ਬਿਨਾਂ ਨੰਗੇ ਪ੍ਰਾਪਰਟੀ ਨਾਮ ਵੈਧ JSONPath ਨਹੀਂ ਹਨ। - ਡੌਟ ਨੋਟੇਸ਼ਨ (
$.store.book) ਜਾਂ ਬ੍ਰੈਕਟ ਨੋਟੇਸ਼ਨ ($['store']['book']) ਨਾਲ ਚਾਈਲਡ ਮੈਂਬਰਾਂ ਵਿੱਚ ਜਾਓ। ਜਦੋਂ ਕਿਸੇ ਕੁੰਜੀ ਵਿੱਚ ਇੱਕ ਸਪੇਸ, ਇੱਕ ਹਾਈਫਨ, ਜਾਂ ਕੋਈ ਅਜਿਹਾ ਅੱਖਰ ਹੁੰਦਾ ਹੈ ਜੋ ਵੈਧ ਪਛਾਣਕਰਤਾ ਨਹੀਂ ਹੈ, ਤਾਂ ਬ੍ਰੈਕਟ ਨੋਟੇਸ਼ਨ ਲੋੜੀਂਦੀ ਹੈ। - ਰਿਕਰਸਿਵ ਡਿਸੈਂਟ ਓਪਰੇਟਰ
..ਨਾਲ ਇੱਕੋ ਵਾਰ ਹਰ ਪੱਧਰ ਖੋਜੋ। ਐਕਸਪ੍ਰੈਸ਼ਨ$..authorਡੂੰਘਾਈ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਟ੍ਰੀ ਵਿੱਚ ਕਿਤੇ ਵੀ ਹਰauthorਮੁੱਲ ਇਕੱਠਾ ਕਰਦਾ ਹੈ। - ਐਰੇ ਤੱਤਾਂ ਨੂੰ ਇੰਡੈਕਸ ਦੁਆਰਾ ਚੁਣੋ (
[0], jsonpath-plus ਵਿੱਚ ਆਖਰੀ ਆਈਟਮ ਲਈ[-1]), ਉਹਨਾਂ ਨੂੰ[start:end]ਨੋਟੇਸ਼ਨ ਨਾਲ ਸਲਾਈਸ ਕਰੋ ([0:3]ਪਹਿਲੇ ਤਿੰਨ ਵਾਪਸ ਕਰਦਾ ਹੈ), ਜਾਂ ਵਾਈਲਡਕਾਰਡ[*]ਨਾਲ ਹਰ ਤੱਤ ਫੜੋ। [?(...)]ਅੰਦਰ ਪ੍ਰੈਡੀਕੇਟ ਨਾਲ ਤੱਤ ਫਿਲਟਰ ਕਰੋ। ਪ੍ਰੈਡੀਕੇਟ ਅੰਦਰ,@ਮੌਜੂਦਾ ਤੱਤ ਦਾ ਹਵਾਲਾ ਦਿੰਦਾ ਹੈ, ਇਸ ਲਈ[?(@.price<10)]ਸਿਰਫ਼ ਉਹ ਆਈਟਮ ਰੱਖਦਾ ਹੈ ਜਿਨ੍ਹਾਂ ਦਾprice10 ਤੋਂ ਘੱਟ ਹੈ।- ਆਉਟਪੁੱਟ ਫਾਰਮੈਟ ਚੁਣੋ। Values ਮੈਚ ਕੀਤਾ ਡੇਟਾ ਵਾਪਸ ਕਰਦੀ ਹੈ। Paths ਹਰ ਮੈਚ ਦਾ JSONPath ਵਾਪਸ ਕਰਦੀ ਹੈ। Pointers ਹਰ ਮੈਚ ਲਈ ਬਰਾਬਰ RFC 6901 JSON Pointer ਵਾਪਸ ਕਰਦੀ ਹੈ।
ਇਹ JSONPath ਟੈਸਟਰ ਕਿਉਂ ਵਰਤੋ?
- ਤੁਹਾਡੀ JSON ਕਦੇ ਬ੍ਰਾਊਜ਼ਰ ਨਹੀਂ ਛੱਡਦੀ। ਪੁੱਛਗਿੱਛ ਪੇਜ ਅੰਦਰ ਚੱਲਦੀ ਹੈ, ਇਸ ਲਈ ਉਤਪਾਦਨ ਫਿਕਸਚਰ, ਗਾਹਕ PII, ਅਤੇ ਪ੍ਰੀ-ਰਿਲੀਜ਼ API ਜਵਾਬ ਤੁਹਾਡੀ ਮਸ਼ੀਨ ਤੇ ਰਹਿੰਦੇ ਹਨ।
- ਇੰਜਣ
jsonpath-plus9.x ਹੈ, ਉਹੀ ਲਾਇਬ੍ਰੇਰੀ ਜੋ ਬਹੁਤ ਸਾਰੇ ਉਤਪਾਦਨ ਟੈਸਟ ਸੂਟਾਂ ਦਾ ਆਧਾਰ ਬਣਦੀ ਹੈ। ਇੱਥੇ ਜੋ ਨਤੀਜੇ ਦਿਖਦੇ ਹਨ ਉਹੀ ਤੁਹਾਡੀ ਬਿਲਡ ਪਾਈਪਲਾਈਨ ਦੇਖੇਗੀ। - ਤਿੰਨ ਆਉਟਪੁੱਟ ਮੋਡ ਆਮ ਡਾਊਨਸਟ੍ਰੀਮ ਖਪਤਕਾਰਾਂ ਨੂੰ ਕਵਰ ਕਰਦੇ ਹਨ: ਕਾਪੀ-ਪੇਸਟ ਲਈ ਕੱਚੇ Values, ਡੀਬੱਗਿੰਗ ਲਈ Paths, ਅਤੇ JSON Patch ਵਰਕਫਲੋਜ਼ ਲਈ RFC 6901 Pointers।
- ਫਿਲਟਰ ਐਕਸਪ੍ਰੈਸ਼ਨਾਂ
preventEval: trueਨਾਲ ਚੱਲਦੀਆਂ ਹਨ, ਇਸ ਲਈ ਪੇਸਟ ਕੀਤੀ ਪੁੱਛਗਿੱਛ ਹੋਸਟ ਪੇਜ ਦੇ ਵਿਰੁੱਧ ਮਨਮਾਨੀ JavaScript ਚਲਾ ਨਹੀਂ ਸਕਦੀ।
JSONPath ਦੀਆਂ ਆਮ ਵਰਤੋਂ
JSONPath ਕਿਤੇ ਵੀ ਦਿਖਦਾ ਹੈ ਜਿੱਥੇ ਕੋਡ ਨੂੰ JSON ਪੇਲੋਡ ਤੋਂ ਖੇਤਰ ਕੱਢਣਾ ਹੋਵੇ:
- Postman ਟੈਸਟ: Postman ਵਿੱਚ Tests ਟੈਬ
pm.response.json()ਨੂੰ ਅਸਰਸ਼ਨਾਂ ਲਈ JSONPath-ਸ਼ੈਲੀ ਐਕਸੈੱਸ ਦੇ ਨਾਲ ਐਕਸਪੋਜ਼ ਕਰਦੀ ਹੈ। ਟੀਮਾਂ ਇੱਕ ਜਵਾਬ ਵਿੱਚੋਂ ਇੱਕ ਖੇਤਰ ਕੱਢਣ ਅਤੇ CI ਵਿੱਚ ਉਸ ਉੱਤੇ ਦਾਅਵਾ ਕਰਨ ਲਈ$.data.user.emailਵਰਗਾ ਇੱਕ ਇਕੱਲਾ ਐਕਸਪ੍ਰੈਸ਼ਨ ਲਿਖਦੀਆਂ ਹਨ। - k6 ਲੋਡ ਟੈਸਟ: k6 ਸਕ੍ਰਿਪਟਾਂ
check()ਬਲਾਕ ਅੰਦਰjsonpath()ਕਾਲ ਕਰਦੀਆਂ ਹਨ ਤਾਂ ਜੋ ਜਵਾਬ ਬਾਡੀਆਂ ਤੋਂ ਮੁੱਲ ਕੱਢੋ ਅਤੇ SLA ਥ੍ਰੈਸ਼ਹੋਲਡ ਦਾਅਵਾ ਕਰੋ। - ਡੇਟਾ ਟ੍ਰਾਂਸਫਾਰਮ ਲਈ JSON DSL: AWS Step Functions ਇਵੈਂਟ ਪੇਲੋਡਾਂ ਨੂੰ ਸਟੇਟਾਂ ਵਿਚਕਾਰ ਮੁੜ-ਆਕਾਰ ਦੇਣ ਲਈ
InputPath,ResultPath, ਅਤੇParametersਦੇ ਅੰਦਰ JSONPath ਦਾ ਮੁਲਾਂਕਣ ਕਰਦਾ ਹੈ। Argo Workflows ਇੱਕ ਐਰੇ ਉੱਤੇ ਕਾਰਜਾਂ ਨੂੰ ਫੈਨ-ਆਊਟ ਕਰਨ ਲਈwithParamਵਿੱਚ JSONPath ਵਰਤਦਾ ਹੈ। Kuberneteskubectl -o jsonpathਕਲਸਟਰ ਆਬਜੈਕਟਾਂ ਤੋਂ ਖੇਤਰ ਕੱਢਣ ਲਈ ਇੱਕੋ ਸਿੰਟੈਕਸ ਵਰਤਦਾ ਹੈ।
ਕੰਮ ਕੀਤੀ ਉਦਾਹਰਣ
ਕੈਨੋਨੀਕਲ Goessner ਫਿਕਸਚਰ ਚਾਰ ਕਿਤਾਬਾਂ ਵਾਲਾ ਬੁੱਕ ਸਟੋਰ ਦਸਤਾਵੇਜ਼ ਹੈ, ਹਰ ਇੱਕ category, author, title, ਅਤੇ price ਰੱਖਦੀ ਹੈ। ਉਸ ਫਿਕਸਚਰ ਦੇ ਖਿਲਾਫ਼, ਐਕਸਪ੍ਰੈਸ਼ਨ $.store.book[?(@.price<10)].title ਤਿੰਨ ਕਦਮਾਂ ਵਿੱਚ ਚੱਲਦਾ ਹੈ। ਪਹਿਲਾਂ, $.store.book ਸਾਰੀਆਂ ਚਾਰ ਕਿਤਾਬਾਂ ਦੀ ਐਰੇ ਵਿੱਚ ਰੈਜ਼ੋਲਵ ਹੁੰਦਾ ਹੈ। ਅੱਗੇ, ਫਿਲਟਰ [?(@.price<10)] ਸਿਰਫ਼ ਉਹ ਇੱਕ ਕਿਤਾਬ ਰੱਖਦਾ ਹੈ ਜਿਸਦੀ ਕੀਮਤ 10 ਤੋਂ ਘੱਟ ਹੈ (8.95 ਵਾਲੀ ਐਂਟਰੀ)। ਅੰਤ ਵਿੱਚ, .title ਉਸ ਕਿਤਾਬ ਦਾ ਸਿਰਲੇਖ ਕੱਢਦਾ ਹੈ। ਨਤੀਜਾ ["Sayings of the Century"] ਹੈ। Paths ਵੱਲ ਬਦਲਣ ਨਾਲ ["$['store']['book'][0]['title']"] ਵਾਪਸ ਮਿਲਦਾ ਹੈ, ਅਤੇ Pointers ["/store/book/0/title"] ਵਾਪਸ ਕਰਦਾ ਹੈ।
ਆਪਣੀਆਂ ਐਕਸਪ੍ਰੈਸ਼ਨਾਂ ਇੱਥੇ ਪ੍ਰੋਟੋਟਾਈਪ ਕਰੋ, ਫਿਰ ਸਿੱਧੇ Postman, k6, kubectl, ਜਾਂ Step Functions ਵਿੱਚ ਪਾਓ। ਪੇਸਟ ਕਰੋ, ਪੁੱਛਗਿੱਛ ਕਰੋ, ਕਾਪੀ ਕਰੋ। ਕੁਝ ਵੀ ਨੈੱਟਵਰਕ ਪਾਰ ਨਹੀਂ ਕਰਦਾ।
JSONPath ਕੀ ਹੈ?
JSONPath JSON ਦਸਤਾਵੇਜ਼ਾਂ ਲਈ ਇੱਕ ਪੁੱਛਗਿੱਛ ਭਾਸ਼ਾ ਹੈ, XML ਲਈ XPath ਦੇ ਸਮਾਨ। Stefan Goessner ਦੁਆਰਾ 2007 ਵਿੱਚ ਪ੍ਰਸਤਾਵਿਤ ਅਤੇ IETF ਦੁਆਰਾ 2024 ਵਿੱਚ RFC 9535 ਵਜੋਂ ਮਿਆਰੀ ਬਣਾਈ ਗਈ।
ਇਹ ਇੱਕ JSON ਟ੍ਰੀ ਦੇ ਅੰਦਰ ਨੋਡਾਂ ਨੂੰ ਚੁਣਨ ਲਈ $ (ਦਸਤਾਵੇਜ਼ ਰੂਟ) ਨਾਲ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲਾ ਇੱਕ ਸੰਖੇਪ ਐਕਸਪ੍ਰੈਸ਼ਨ ਸਿੰਟੈਕਸ ਵਰਤਦਾ ਹੈ ਅਤੇ ਡੌਟ ਨੋਟੇਸ਼ਨ, ਐਰੇ ਸਬਸਕ੍ਰਿਪਟ, ਵਾਈਲਡਕਾਰਡ, ਸਲਾਈਸ, ਰਿਕਰਸਿਵ ਡਿਸੈਂਟ (..), ਅਤੇ ਫਿਲਟਰ ਐਕਸਪ੍ਰੈਸ਼ਨਾਂ ([?(...)]) ਨੂੰ ਸਪੋਰਟ ਕਰਦਾ ਹੈ।
JSONPath JMESPath ਜਾਂ jq ਤੋਂ ਕਿਵੇਂ ਵੱਖਰਾ ਹੈ?
ਤਿੰਨੋਂ JSON ਪੁੱਛਗਿੱਛ ਕਰਦੇ ਹਨ, ਪਰ ਉਨ੍ਹਾਂ ਦੀ ਗ੍ਰਾਮਰ ਅਤੇ ਟੀਚੇ ਵੱਖਰੇ ਹਨ। JMESPath AWS CLI/SDK ਮਿਆਰ ਹੈ: JSONPath ਤੋਂ ਸਖ਼ਤ, ਕੋਈ ਰਿਕਰਸਿਵ ਡਿਸੈਂਟ ਨਹੀਂ।
jq ਇੱਕ Turing-complete ਸਕ੍ਰਿਪਟਿੰਗ ਭਾਸ਼ਾ ਹੈ। JSONPath ਵਿਚਕਾਰ ਬੈਠਦੀ ਹੈ: JMESPath ਨਾਲੋਂ ਵਧੇਰੇ ਐਕਸਪ੍ਰੈਸਿਵ, jq ਨਾਲੋਂ ਹਲਕੀ। ਇਹ ਟੈਸਟਰ JSONPath ਲਾਗੂ ਕਰਦਾ ਹੈ।
ਇਹ ਟੈਸਟਰ ਕਿਹੜੀ ਡਾਇਲੈਕਟ ਵਰਤਦਾ ਹੈ?
ਇਹ ਟੈਸਟਰ jsonpath-plus 9.x ਚਲਾਉਂਦਾ ਹੈ। ਉਹ ਲਾਇਬ੍ਰੇਰੀ Goessner 2007 ਸਪੈੱਕ ਨੂੰ ਲਾਗੂ ਕਰਦੀ ਹੈ, ਜ਼ਿਆਦਾਤਰ RFC 9535 ਨੂੰ ਕਵਰ ਕਰਦੀ ਹੈ, ਅਤੇ ਟਾਈਪ ਜਾਂਚਾਂ (@.string(), @.number(), @.boolean()) ਅਤੇ ਪੇਰੈਂਟ ਨੈਵੀਗੇਸ਼ਨ (^) ਵਰਗੇ ਐਕਸਟੈਂਸ਼ਨ ਆਪਰੇਟਰ ਜੋੜਦੀ ਹੈ।
preventEval: true ਫਲੈਗ ਹਮੇਸ਼ਾ ਸੈੱਟ ਹੁੰਦਾ ਹੈ, ਇਸ ਲਈ ਫਿਲਟਰ ਪ੍ਰੈਡੀਕੇਟ JavaScript eval() ਬਿਲਟ-ਇਨ ਦੀ ਬਜਾਏ ਇੱਕ ਸੁਰੱਖਿਅਤ ਇੰਟਰਪ੍ਰੀਟਰ ਰਾਹੀਂ ਚੱਲਦੇ ਹਨ। ਇੱਕ ਪੇਸਟ ਕੀਤੀ ਪੁੱਛਗਿੱਛ ਇਸ ਪੰਨੇ ਖਿਲਾਫ਼ ਮਨਮਾਨਾ ਕੋਡ ਨਹੀਂ ਚਲਾ ਸਕਦੀ।
ਕੀ ਮੈਂ ਵਿਅਕਤੀਗਤ ਮੈਚ ਕੀਤੇ ਮੁੱਲ ਕਾਪੀ ਕਰ ਸਕਦਾ ਹਾਂ?
ਹਾਂ। Copy to clipboard ਬਟਨ ਪੂਰਾ ਨਤੀਜਾ ਬਲਾਕ JSON ਐਰੇ ਵਜੋਂ ਕਾਪੀ ਕਰਦਾ ਹੈ। ਇੱਕ ਮੁੱਲ ਲੈਣ ਲਈ, ਆਉਟਪੁੱਟ ਮੋਡ Values ਤੇ ਬਦਲੋ, ਫਿਰ ਨਤੀਜਾ ਟੈਕਸਟਏਰੀਆ ਵਿੱਚ ਜੋ ਲਾਈਨ ਚਾਹੁੰਦੇ ਹੋ ਚੁਣੋ ਅਤੇ ਬ੍ਰਾਊਜ਼ਰ ਦੀ ਆਮ ਕਾਪੀ ਸ਼ਾਰਟਕੱਟ ਵਰਤੋ।
ਆਉਟਪੁੱਟ ਸਾਦਾ JSON ਟੈਕਸਟ ਹੈ, ਇਸ ਲਈ ਇਹ ਕੋਡ ਸੰਪਾਦਕ, ਟਰਮੀਨਲ, Postman ਟੈਸਟ, ਜਾਂ Slack ਸੁਨੇਹੇ ਵਿੱਚ ਸਾਫ਼ ਪੇਸਟ ਹੁੰਦਾ ਹੈ।