§

Jaribu misemo ya JSONPath

Muundo wa matokeo:
Maelezo mafupi ya JSONPath
Token Meaning
$Kipengele cha mzizi wa hati
@Kipengele cha sasa (kinatumiwa ndani ya misemo ya kuchuja)
.Opereta wa mwanachama wa mtoto: huchagua mtoto aliyeitwa
..Kushuka kwa kina: hutafuta wazao wote
*Kadi-pori: inafanana na kipengele chochote au mali
[*]Vitu vyote vya safu wima
[n]Kipengele cha safu wima kwa faharasa n (kuanzia sifuri)
[start:end]Kipande cha safu wima kutoka mwanzo hadi (bila kujumuisha) mwisho
[?(@.x)]Chuja: vitu ambapo mali x ipo
[?(@.x==1)]Chuja: vitu ambapo mali x ni sawa na 1
[(@.length-1)]Msemo wa hati: kipengele cha mwisho cha safu wima

JSONPath inaonekana kila mahali mkataba wa API unahitaji kukaguliwa dhidi ya mzigo halisi. Timu za kiufundi zinazoandika mifululizo ya kujaribu Postman zinathibitisha sehemu za jibu na JSONPath, hati za kukimbia za k6 huchomoa thamani kutoka kwa majibu ya API, na runbooks za SRE zinafikia misemo ya kuchuja kama [?(@.status=="error")] kukata kumbukumbu za JSON. Kuendesha misemo hiyo kwenye kichupo cha kivinjari kunaweka mzigo wa siri, PII ya wateja, na majibu ya API kabla ya kutolewa mbali na huduma yoyote ya hoja iliyohifadhiwa.

JSONPath ni nini?

JSONPath ni lugha ya hoja kwa hati za JSON, sawa na XPath kwa XML. Stefan Goessner alipendekeza mwaka 2007 kama njia fupi na inayosomeka ya kuonyesha nodi ndani ya mti wa JSON bila kuandika mchanganuzi. Msemo huanza na kichaguzi cha mzizi $ na unaunganisha vipatanishi vya mali, manukta ya safu wima, kadi-pori, kushuka kwa kina, na masharti ya kuchuja hadi unachagua nodi unazotaka. Mwaka 2024 IETF ilichapisha RFC 9535 kusawazisha sintaksia iliyokuwa imegawanyika katika utekelezaji mbalimbali; kipima hiki kinafanya kazi juu ya jsonpath-plus, utekelezaji unaotumika sana wa JavaScript unaoshughulikia rasimu ya Goessner, mengi ya RFC 9535, na baadhi ya opereta wa ziada.

JSONPath inafanya kazi vipi

Msemo wa JSONPath unasomeka kushoto kwenda kulia na kutembea hati ya JSON hatua moja kwa wakati. Kila hatua inachukua seti ya nodi zilizopita hatua ya awali na kuzipunguza zaidi. Mfululizo kamili wa tathmini:

  1. Anchors na kichaguzi cha mzizi $. Kila msemo huanza hapa, ukiashiria thamani ya kiwango cha juu, iwe ni kitu au safu wima. Majina ya mali yaliyowazi bila $ ya kuongoza si JSONPath halali.
  2. Tembea ndani ya wanachama wa watoto na nukta ($.store.book) au alama za mabano ($['store']['book']). Alama za mabano zinahitajika wakati funguo ina nafasi, kistari, au tabia yoyote ambayo si kitambulisho halali.
  3. Tafuta kila kiwango kwa wakati mmoja na opereta wa kushuka kwa kina ... Msemo $..author hukusanya kila thamani ya author popote kwenye mti, bila kujali kina. Hii ndiyo opereta ambayo JMESPath hana.
  4. Chagua vipengele vya safu wima kwa faharasa ([0], [-1] kwa kipengele cha mwisho katika jsonpath-plus), vikata kwa alama za [start:end] ([0:3] inarudisha vitatu vya kwanza), au chukua kila kipengele na kadi-pori [*].
  5. Chuja vipengele na kipengele cha utabiri ndani ya [?(...)]. Ndani ya utabiri, @ inaashiria kipengele cha sasa, kwa hivyo [?(@.price<10)] huweka vitu ambavyo sehemu yake ya price iko chini ya 10. Vichujio vinachanganyika na mwili wa njia, kwa hivyo unaweza kuchuja kisha kushuka, au kushuka kisha kuchuja.
  6. Chagua muundo wa matokeo. Thamani inarudisha data iliyofanana yenyewe. Njia inarudisha JSONPath ya kila mechi ili uweze kuona nini injini ilitatua. Viashiria inarudisha RFC 6901 JSON Pointer sawa kwa kila mechi, inayofaa wakati mtumiaji wa mtiririko wa chini ni JSON Patch au mthibitishaji wa JSON Schema.

Kwa nini utumie kipima hiki cha JSONPath?

  • JSON yako haiacha kivinjari. Hoja inafanya kazi ndani ya ukurasa, kwa hivyo vifaa vya uzalishaji, PII ya wateja, na majibu ya API kabla ya kutolewa yanabaki kwenye mashine yako.
  • Injini ni jsonpath-plus 9.x, maktaba ile ile inayosaidia mifululizo mingi ya majaribio ya uzalishaji na uthibitisho wa CI. Matokeo unayoyaona hapa yanalingana na matokeo mfululizo wako wa kujenga utakayoyaona.
  • Hali tatu za matokeo zinashughulikia watumiaji wa kawaida wa mtiririko wa chini: Thamani ghafi kwa kunakili-kubandika, Njia za kutatua utatuzi wa injini, na RFC 6901 Viashiria kwa mifumo ya JSON Patch na JSON Schema.
  • Misemo ya kuchuja inafanya kazi na preventEval: true, kwa hivyo hoja iliyobandikwa haiwezi kutekeleza JavaScript yoyote dhidi ya ukurasa wa mwenyeji. Hilo ni muhimu wakati msemo ulikuja kutoka kwa ujumbe wa Slack, tiketi ya Jira, au kibao cha kunakili cha mwenzako.

Matumizi ya kawaida ya JSONPath

JSONPath inaonekana popote msimbo unahitaji kuchomoa sehemu kutoka kwa mzigo wa JSON bila kuandika kushuka kwa kina kwa mkono:

  • Majaribio ya Postman: kichupo cha Majaribio katika Postman kinaonyesha pm.response.json() pamoja na upatikanaji wa mtindo wa JSONPath kwa uthibitisho. Timu zinaandika msemo mmoja kama $.data.user.email kuchomoa sehemu kutoka kwa jibu na kuthibitisha juu yake katika CI.
  • Majaribio ya mzigo wa k6: hati za k6 zinaita jsonpath() ndani ya block ya check() kuchomoa thamani kutoka miili ya jibu na kuthibitisha viwango vya SLA. Msemo ule ule uliohakikisha mkataba katika Postman unaweza kufunga jaribio la mzigo chini ya k6.
  • JSON DSL kwa mabadiliko ya data: AWS Step Functions inatathmini JSONPath ndani ya InputPath, ResultPath, na Parameters kubadilisha mzigo wa matukio kati ya hali. Argo Workflows inatumia JSONPath katika withParam kupanua kazi juu ya safu wima. Kubernetes kubectl -o jsonpath inatumia sintaksia ile ile kuchomoa sehemu kutoka vitu vya nguzo.

Mfano uliofanyiwa kazi

Kifaa cha Goessner cha kawaida ni hati ya duka la vitabu yenye vitabu vinne, kila kimoja kikiwa na category, author, title, na price. Dhidi ya kifaa hicho, msemo $.store.book[?(@.price<10)].title unafanya kazi katika hatua tatu. Kwanza, $.store.book inatatua hadi safu wima ya vitabu vyote vinne. Kisha, kichujio [?(@.price<10)] huweka kitabu pekee chenye bei chini ya 10 (ingizo kwa 8.95). Hatimaye, .title inachomoa kichwa cha kitabu hicho. Matokeo ni ["Sayings of the Century"]. Kubadilisha hadi Njia inarudisha ["$['store']['book'][0]['title']"], na Viashiria inarudisha ["/store/book/0/title"].

Tengeneza misemo yako hapa, kisha iingize moja kwa moja kwenye Postman, k6, kubectl, au mashine ya hali ya Step Functions. Bandika, hoji, nakili. Hakuna kinachopita mtandao.

JSONPath ni nini?

JSONPath ni lugha ya hoja kwa hati za JSON, inayofanana na XPath kwa XML. Stefan Goessner alipendekeza mwaka 2007 na IETF ikaisawazisha kama RFC 9535 mwaka 2024.

Inatumia sintaksia fupi ya msemo inayoanza na $ (mzizi wa hati) na inasaidia nukta, manukta ya safu wima, kadi-pori, vipande, kushuka kwa kina (..), na misemo ya kuchuja ([?(...)]) kuchagua nodi ndani ya mti wa JSON.

JSONPath inatofautiana na JMESPath au jq vipi?

Zote tatu huhoji JSON, lakini sarufi na malengo yao yanatofautiana. JMESPath ni kiwango cha AWS CLI / SDK: kali zaidi kuliko JSONPath, bila kushuka kwa kina, imejengwa kwa mradi usio na athari za pembeni unaoweza kutabiriwa.

jq ni lugha kamili ya uandishi wa Turing ambayo si tu inayohoji JSON bali pia inabadilisha, kupunguza, na kutiririsha. JSONPath iko kati yao: yenye kueleza zaidi kuliko JMESPath shukrani kwa kushuka kwa kina na vichujio, nyepesi kuliko jq, na sintaksia inayosaidiwa sana zaidi katika zana za majaribio za matumizi ya jumla (Postman, Playwright, REST Assured, kubectl, Step Functions). Kipima hiki kinatekeleza JSONPath.

Kipima hiki kinatumia lahaja gani?

Kipima hiki kinaendesha jsonpath-plus 9.x. Maktaba hiyo inatekeleza uainishi wa Goessner 2007, inashughulikia mengi ya RFC 9535, na inaongeza opereta wa ziada kama ukaguzi wa aina (@.string(), @.number(), @.boolean()) na urambazaji wa mzazi (^).

Bendera ya preventEval: true imewekwa daima, kwa hivyo vitabiri vya kuchuja hufanya kazi kupitia mkalimani salama badala ya JavaScript eval() iliyojengwa ndani. Hoja iliyobandikwa haiwezi kutekeleza msimbo wowote dhidi ya ukurasa huu.

Je, naweza kunakili thamani moja zilizofanana?

Ndiyo. Kitufe cha Nakili kwenye ubao wa kunakili kinakili block nzima ya matokeo kama safu wima ya JSON. Kuchukua thamani moja, badilisha hali ya matokeo hadi Thamani, kisha chagua mstari unaotaka kwenye eneo la maandishi la matokeo na utumie njia ya kawaida ya kunakili ya kivinjari chako (Ctrl/Cmd + C).

Matokeo ni maandishi ya JSON wazi, kwa hivyo yanabandikwa safi katika kihariri cha msimbo, terminal, jaribio la Postman, au ujumbe wa Slack.