Jump to content

JSON pointer: Difference between revisions

m
→‎{{header|Phix}}: added uri percent decoding
m (Undo revision 353490 by Petelomax (talk))
m (→‎{{header|Phix}}: added uri percent decoding)
Line 467:
<span style="color: #008080;">if</span> <span style="color: #000000;">p</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]!=</span><span style="color: #008000;">'/'</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">throw</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"pointers must start with a slash or be the empty string"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">substitute_all</span><span style="color: #0000FF;">,{</span><span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">p</span><span style="color: #0000FF;">,</span><span style="color: #008000;">'/'</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">),{{</span><span style="color: #008000;">"~1"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"~0"</span><span style="color: #0000FF;">}},{{</span><span style="color: #008000;">"/"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"~"</span><span style="color: #0000FF;">}}})[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]</span>
<span style="color: #008080;">catchend</span> <span style="color: #000000008080;">efunction</span>
<span style="color: #008080;">iffunction</span> <span style="color: #000000;">jsonuri_percent_decode</span><span style="color: #0000FF;">={}(</span> <span style="color: #008080004080;">thenstring</span> <span style="color: #7060A8;">throw</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">&</span><span style="color: #008000;">": no such field"s</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000080;font-style:italic;">-- eg `/k%22l` -&gt; `/k"l`</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">pc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find_all</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'%'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span>
<span style="color: #000000;">rc</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span> <span style="color: #008080;">in</span> <span style="color: #000000;">pc</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">nb1</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">nb2</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">2</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">nb1</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"0123456789ABCDEF"</span><span style="color: #0000FF;">)</span>
<span style="color: #000000;">nb2</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">],</span><span style="color: #008000;">"0123456789ABCDEF"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">tryif</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">nb1</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">or</span> <span style="color: #000000;">nb2</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">pc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">else</span>
<span style="color: #000000;">rc</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">nb1</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)*</span><span style="color: #000000;">16</span><span style="color: #0000FF;">+</span><span style="color: #000000;">nb2</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">j</span> <span style="color: #008080;">in</span> <span style="color: #7060A8;">reverse</span><span style="color: #0000FF;">(</span><span style="color: #000000;">pc</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">j</span> <span style="color: #008080;">then</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">..</span><span style="color: #000000;">j</span><span style="color: #0000FF;">+</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rc</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
Line 480 ⟶ 502:
<span style="color: #000000;">json</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">json</span><span style="color: #0000FF;">[</span><span style="color: #000000;">k</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">jtype</span><span style="color: #0000FF;">=</span><span style="color: #000000;">JSON_OBJECT</span> <span style="color: #008080;">then</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">jt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">extract_json_field</span><span style="color: #0000FF;">(</span><span style="color: #000000;">json</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{})</span>
<span style="color: #008080;">try</span>
<span style="color: #000000008080;">json</span> <span style="color: #0000FF;">=if</span> <span style="color: #000000;">extract_json_fieldjt</span><span style="color: #0000FF;">(</span><span style="color: #000000;">json</span><span style="color: #0000FF;">,{}</span> <span style="color: #000000008080;">tthen</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{})</span>
<span style="color: #000000;">jt</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">extract_json_field</span><span style="color: #0000FF;">(</span><span style="color: #000000;">json</span><span style="color: #0000FF;">,</span><span style="color: #000000;">uri_percent_decode</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">),{})</span>
<span style="color: #008080;">catch</span> <span style="color: #000000;">e</span>
<span style="color: #7060A8008080;">throwend</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span> <span style="color: #0000FF;">&</span> <span style="color: #008000;">" does not exist"</span><span style="color: #0000FF008080;">)if</span>
<span style="color: #008080000080;">end</span> <span font-style="color: #008080italic;">try</span>-- Aside: parse_json() returns {JSON_OBJECT} not {}, and
-- likwise {JSON_ARRAY} to represent the empty array [],
<span style="color: #008080;">if</span> <span style="color: #000000;">json</span><span style="color: #0000FF;">={}</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">throw</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">&</span><span style="color: #008000;">": no such field"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
-- hence {} is a sound choice for the "not found" value.</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">jt</span><span style="color: #0000FF;">={}</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">throw</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">&</span><span style="color: #008000;">": no such field"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #000000;">json</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">jt</span>
<span style="color: #008080;">else</span> <span style="color: #000080;font-style:italic;">-- native/keyword</span>
<span style="color: #7060A8;">throw</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"non subscriptable: %v [%s]"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">json</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">})</span>
Line 515 ⟶ 540:
<span style="color: #008000;">"/abc"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"/def/"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"/g~1h"</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- or "/g%2Fh",</span>
<span style="color: #008000;">"/i~0j"</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- or "/i%7Ej",</span>
<span style="color: #008000;">"/wiki/links/0"</span><span style="color: #0000FF;">,</span>
<span style="color: #008000;">"/wiki/links/1"</span><span style="color: #0000FF;">,</span>
7,820

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.