JSON යුනික්ස් මෙවලම් සමඟ විග්‍රහ කිරීම


915

මම උත්සාහ කරන්නේ JSON වක්‍ර ඉල්ලීමකින් ආපසු පැමිණීම විග්‍රහ කිරීමට ය:

curl 'http://twitter.com/users/username.json' |
    sed -e 's/[{}]/''/g' | 
    awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'

ඉහත දැක්වෙන්නේ JSON ක්ෂේත්‍රයට බෙදීමයි, උදාහරණයක් ලෙස:

% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...

විශේෂිත ක්ෂේත්‍රයක් මුද්‍රණය කරන්නේ කෙසේද -v k=text?


5
Erm එය හොඳ නොවන json parsing btw ... නූල් වල ඇති ගැලවීමේ චරිත ගැන කුමක් කිව හැකිද ... යනාදිය SO හි මේ සඳහා පයිතන් පිළිතුරක් තිබේද (පර්ල් පිළිතුරක් පවා ...)?
මාර්ටින්

58
"X ගැටලුව වෙනත් භාෂාවක් සමඟ පහසුවෙන් විසඳා ගත හැකිය" යනුවෙන් යමෙකු පවසන ඕනෑම වේලාවක එය කේතයකි "මගේ මෙවලම් පෙට්ටියට ඇත්තේ නියපොතු පැදවීම සඳහා පර්වතයක් පමණි ... වෙන කිසිවක් ගැන කරදර වන්නේ ඇයි?"
බ්‍රයන් එච්

22
@BryanH: සමහර විට භාෂාව Y හැර කළ හැකි නොතකා Y යෝජනා කරන පුද්ගලයා බොහෝ භාෂා දන්නා විශේෂ ප්රශ්නය X විසඳීමට වැඩි සමන්විත විය.
jfs

16
කරුණාව පරක්කුයි, නමුත් මෙන්න එය යනවා. grep -Po '"'"version"'"\s*:\s*"\K([^"]*)' package.json. මෙය කාර්යය පහසුවෙන් සහ grep සමඟ පමණක් විසඳන අතර සරල JSON සඳහා පරිපූර්ණව ක්‍රියා කරයි. සංකීර්ණ JSONs සඳහා ඔබ නිසි විග්‍රහයක් භාවිතා කළ යුතුය.
ඩයොස්නි

2
ususer, මාතෘකාවෙහි "යුනික්ස් මෙවලම් සමඟ" සංස්කරණය "සෙඩ් සහ අවුල්" සමඟ වෙනස් කිරීම ඔබට හොඳද?
චාල්ස් ඩෆි

Answers:


1181

විධාන රේඛාවෙන් JSON හැසිරවීම සඳහා විෙශේෂෙයන් නිර්මාණය කර ඇති මෙවලම් ගණනාවක් ඇති අතර, ඒවා අව්ක් සමඟ කිරීමට වඩා පහසු සහ විශ්වාසදායක වනු ඇත, වැනි jq:

curl -s 'https://api.github.com/users/lambda' | jq -r '.name'

jsonමොඩියුලය භාවිතා කරන පයිතන් වැනි ඔබේ පද්ධතියේ දැනටමත් ස්ථාපනය කර ඇති මෙවලම් සමඟද ඔබට මෙය කළ හැකිය , එබැවින් නිසි JSON විග්‍රහකයකුගේ වාසිය තිබියදීත් අමතර පරායත්තතාවයන් වළක්වා ගන්න. පහත දැක්වෙන උපකල්පනය ඔබට මුල් JSON කේතනය කළ යුතු UTF-8 භාවිතා කිරීමට අවශ්‍ය යැයි උපකල්පනය කරන අතර බොහෝ නූතන පර්යන්තයන් ද භාවිතා කරන්නේ එයයි:

පයිතන් 3:

curl -s 'https://api.github.com/users/lambda' | \
    python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"

පයිතන් 2:

export PYTHONIOENCODING=utf8
curl -s 'https://api.github.com/users/lambda' | \
    python2 -c "import sys, json; print json.load(sys.stdin)['name']"

Notes තිහාසික සටහන්

මෙම පිළිතුර මුලින් නිර්දේශ කර ඇත්තේ jsawk වන අතර එය තවමත් ක්‍රියාත්මක විය යුතු නමුත් එය භාවිතා කිරීමට වඩා ටිකක් කරදරකාරී jqවන අතර එය පයිතන් පරිවර්තකයෙකුට වඩා අඩු පොදු වන ජාවාස්ක්‍රිප්ට් පරිවර්තකයක් ස්ථාපනය කර ඇති අතර එය රඳා පවතී. එබැවින් ඉහත පිළිතුරු වඩාත් යෝග්‍ය වේ:

curl -s 'https://api.github.com/users/lambda' | jsawk -a 'return this.name'

මෙම පිළිතුර මුලින් ට්විටර් ඒපීඅයි ද භාවිතා කළ නමුත් එම ඒපීඅයි තවදුරටත් ක්‍රියාත්මක නොවන බැවින් අත්හදා බැලීමට උදාහරණ පිටපත් කිරීම දුෂ්කර වන අතර නව ට්විටර් ඒපීඅයි ඒපීඅයි යතුරු අවශ්‍ය වේ, එබැවින් මම ගිට්හබ් ඒපීඅයි භාවිතා කිරීමට මාරු වී සිටිමි. API යතුරු නොමැතිව පහසුවෙන් භාවිතා කළ හැකිය. මුල් ප්‍රශ්නයට පළමු පිළිතුර වනුයේ:

curl 'http://twitter.com/users/username.json' | jq -r '.text'

7
rathrau +1. jq එය ගබඩාවේ ඇති අතර එය භාවිතා කිරීමට පහසුය, එබැවින් එය jsawk ට වඩා හොඳය. මම දෙකම මිනිත්තු කිහිපයක් අත්හදා බැලුවෙමි, jq මෙම සටන ජය ගත්තේය
Szymon Sadło

1
පයිතන් 2 හි, ඔබ ප්‍රතිදානය වෙනත් විධානයකට නල කරන්නේ නම්, එම printප්‍රකාශය සෑම විටම ASCII වෙත සංකේතවත් කරනුයේ ඔබ පයිතන් පයිප්පයක භාවිතා කරන බැවිනි. PYTHONIOENCODING=<desired codec>ඔබේ පර්යන්තයට ගැලපෙන වෙනස් ප්‍රතිදාන කේතීකරණයක් සැකසීමට විධානයට ඇතුළු කරන්න . පයිතන් 3 හි, පෙරනිමිය UTF-8 වේ ( print() ශ්‍රිතය භාවිතා කරමින් ).
මාර්ටිජන් පීටර්ස්

2
OSX හි jq ස්ථාපනය කරන්න බීර ස්ථාපනය කරන්න jq
ඇන්ඩි ෆ්‍රේලි

1
curl -sසමාන වන අතර curl --silent, jq -rඑයින් අදහස් වන්නේ jq --raw-outputවචන උපුටා දැක්වීම් නොමැතිව ය.
සර්ජ් ස්ට්‍රෝබන්ඩ්

python -c "ආයාත ඉල්ලීම්; r = request.get (' api.github.com/users/lambda '); print r.json () [' name '];" . සරලම!
NotTooTechy

290

විශේෂිත යතුරක් සඳහා අගයන් ඉක්මණින් උකහා ගැනීම සඳහා, මම පෞද්ගලිකව කැමතියි “grep -o” භාවිතා කිරීමට, එය නැවත ලබා දෙන්නේ රීජෙක්ස්ගේ තරගය පමණි. උදාහරණයක් ලෙස, ට්වීට් වලින් "පෙළ" ක්ෂේත්‍රය ලබා ගැනීමට, වැනි දෙයක්:

grep -Po '"text":.*?[^\\]",' tweets.json

මෙම රීජෙක්ස් ඔබ සිතනවාට වඩා ශක්තිමත් ය; නිදසුනක් ලෙස, කොමා කාවැද්දූ නූල් සහ ඒවා තුළ ඇති උපුටා දැක්වීම් වලින් ගැලවී ඇත. මම හිතන්නේ තව ටිකක් වැඩ කිරීමෙන් ඔබට පරමාණුක නම් වටිනාකම උකහා ගැනීම සහතික කළ හැකි එකක් බවට පත් කළ හැකිය. (එයට කැදැල්ලක් තිබේ නම්, රීජෙක්ස් කෙනෙකුට එය කළ නොහැක.)

තව දුරටත් පිරිසිදු කිරීම සඳහා (නූල්වල මුල් පිටවීම වළක්වා ගත්තද) ඔබට මෙවැනි දෙයක් භාවිතා කළ හැකිය : | perl -pe 's/"text"://; s/^"//; s/",$//'. ( මෙම විශ්ලේෂණය සඳහා මම මෙය කළෙමි .)

ඔබ සැබෑ JSON විග්‍රහයක් භාවිතා කළ යුතු යැයි අවධාරනය කරන සියලු වෛරකරුවන්ට - ඔව්, එය නිවැරදි බව සඳහා අත්‍යවශ්‍ය වේ, නමුත්

  1. දත්ත පිරිසිදු කිරීමේ දෝෂ පරීක්ෂා කිරීම සඳහා අගයන් ගණන් කිරීම හෝ දත්ත පිළිබඳ සාමාන්‍ය හැඟීමක් ලබා ගැනීම වැනි ඉතා ඉක්මන් විශ්ලේෂණයක් කිරීමට, විධාන රේඛාවේ යමක් ගැටීම වේගවත් වේ. පිටපතක් ලිවීම සඳහා සංස්කාරකයක් විවෘත කිරීම අවධානය වෙනතකට යොමු කරයි.
  2. grep -oයනු පයිතන් සම්මත jsonපුස්තකාලයට වඩා වේගයෙන් ඇණවුම් කිරීමයි , අවම වශයෙන් මෙය ට්වීට් සඳහා කරන විට (ඒවා K 2 KB බැගින්). jsonමෙය මන්දගාමී නිසාදැයි මට විශ්වාස නැත (මම යම් වේලාවක යජ්ල් සමඟ සැසඳිය යුතුය); නමුත් ප්‍රතිපත්තිමය වශයෙන්, රීජෙක්ස් වේගවත් විය යුතු අතර එය සීමිත තත්වයක් වන අතර එය වඩාත් ප්‍රශස්ත කළ හැකි ය, පුනරාවර්තනයට සහාය විය යුතු පාර්සර් වෙනුවට, මේ අවස්ථාවේ දී, ඔබ නොසලකන ව්‍යුහයන් සඳහා සීපීයූ ගොඩනැගිලි ගස් විශාල ප්‍රමාණයක් වැය කරයි. (යමෙකු සීමිත (ගැඹුරු-සීමිත) JSON විග්‍රහයක් කරන සීමිත රාජ්‍ය සම්ප්‍රේෂකය ලියා ඇත්නම්, එය අපූරු වනු ඇත! මේ අතර අපට “grep -o” ඇත.)

නඩත්තු කළ හැකි කේතයක් ලිවීමට, මම සෑම විටම සැබෑ විග්‍රහ කිරීමේ පුස්තකාලයක් භාවිතා කරමි. මම jsawk උත්සාහ කර නැත , නමුත් එය හොඳින් ක්‍රියාත්මක වන්නේ නම්, එය අංක 1 ස්ථානයට යොමු වේ.

අන්තිම, වෝකියර්, විසඳුම: මම පයිතන් භාවිතා කරන පිටපතක් ලියා jsonඔබට අවශ්‍ය යතුරු ටැබ් වෙන් කළ තීරුවලට උකහා ගනිමි ; පසුව මම awkතීරු වෙත නම් තැබීමට ඉඩ සලසන එතුමකින් එතීමි . මෙහි: json2tsv සහ tsvawk ස්ක්‍රිප්ට් . එබැවින් මෙම උදාහරණය සඳහා එය වනුයේ:

json2tsv id text < tweets.json | tsvawk '{print "tweet " $id " is: " $text}'

මෙම ප්‍රවේශය # 2 අමතන්නේ නැත, එය තනි පයිතන් පිටපතකට වඩා අකාර්යක්ෂම වන අතර එය ටිකක් අස්ථාවර ය: එය නව රේඛා සහ ටැබ් නූල් අගයන් සාමාන්‍යකරණය කිරීමට බල කරයි, අව්ගේ ක්ෂේත්‍රය / වාර්තාගත ලෙස වෙන් කර ඇති ලෝකය දෙස හොඳින් බැලීමට. නමුත් එය ඔබට වඩා විධාන රේඛාවේ රැඳී සිටීමට ඉඩ දෙයි grep -o.


12
ඔබට පූර්ණ සංඛ්‍යා අගයන් අමතක විය. grep -Po '"text":(\d*?,|.*?[^\\]",)'
රොබට්

3
රොබට්: හරි, මගේ රීජෙක්ස් එක ලියා ඇත්තේ එම ක්ෂේත්‍රය සඳහා වන අගයන් සඳහා පමණි. ඔබ පවසන පරිදි පූර්ණ සංඛ්‍යා එකතු කළ හැකිය. ඔබට සියලු වර්ගයන් අවශ්‍ය නම්, ඔබ වැඩි වැඩියෙන් කළ යුතුය: බූලියන්, ශූන්‍ය. අරා සහ වස්තූන් සඳහා වැඩි වැඩක් අවශ්‍ය වේ; සම්මත රීජෙක්ස් යටතේ කළ හැක්කේ ගැඹුරට පමණි.
බ්‍රෙන්ඩන් ඕකොනර්

9
1. jq .nameවිධාන රේඛාවේ ක්‍රියා කරන අතර එයට “ස්ක්‍රිප්ට් එකක් ලිවීමට සංස්කාරකයක් විවෘත කිරීම” අවශ්‍ය නොවේ. 2. ඔබේ
රීජෙක්ස්

8
ඔබට අවශ්‍ය අගයන් පමණක් අවශ්‍ය නම් ඔබට එය අවදි කළ හැකිය. | grep -Po '"text":.*?[^\\]",'|awk -F':' '{print $2}'
ජෙෆ්චාර්ටර්

42
OSX හි -Pවිකල්පය අස්ථානගත වී ඇති බව පෙනේ . මම OSX එකක් 10.11.5 මත පරීක්ෂා හා grep --versionවිය grep (BSD grep) 2.5.1-FreeBSD. මම එය OSX හි "දීර් extended රීජෙක්ස්" විකල්පය සමඟ වැඩ කළෙමි. ඉහළින් ඇති විධානය වනු ඇත grep -Eo '"text":.*?[^\\]",' tweets.json.
ජෙන්ස්

176

මෙහි ඇති සමහර නිර්දේශයන් (අදහස් දැක්වීමේදී) පයිතන් භාවිතය යෝජනා කළ පදනම මත, උදාහරණයක් සොයා ගැනීමට නොහැකි වීම ගැන මම කලකිරීමට පත්වීමි.

ඉතින්, සමහර JSON දත්ත වලින් තනි අගයක් ලබා ගැනීම සඳහා එක් ලයිනර් එකක් මෙන්න. එය උපකල්පනය කරන්නේ ඔබ දත්ත කොහේ හෝ තැනක සිට ගෙන යන බවයි. එබැවින් එය ස්ක්‍රිප්ටින් සන්දර්භය තුළ ප්‍රයෝජනවත් විය යුතුය.

echo '{"hostname":"test","domainname":"example.com"}' | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["hostname"]'

බාෂ් ශ්‍රිතයක් භාවිතා කිරීම සඳහා මම මෙම පිළිතුර පහත වැඩි දියුණු කළෙමි: curl 'some_api' | getJsonVal 'key'
ජෝ හේමිං

pythonpy( github.com/russell91/pythonpy යනු සෑම විටම පාහේ වඩා හොඳ විකල්පයකි python -c, එය පයිප්පයකින් ස්ථාපනය කළ යුතු වුවද, json වෙත පයිප්ප කරන්න py --ji -x 'x[0]["hostname"]'. ඔබට json_input සහාය භාවිතා කිරීමට අවශ්‍ය නොවන්නේ නම්, ඔබට තවමත් ලබා ගත හැකිය ඒවා ස්වයංක්‍රීයව ආනයනය කරයිpy 'json.loads(sys.stdin)[0]["hostname"]'
රසල් ස්ටුවර්ට්

2
ස්තූතියි! වඩාත් ඉක්මන් හා අපිරිසිදු JSON විග්‍රහ කිරීම සඳහා මම එය කඩිනම් කාර්යයකට ඔතා ඇත: jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); print($1)"; }එවිට මට ලිවීමට හැකි විය: curl ...... | jsonq 'json.dumps([key["token"] for key in obj], indent=2)'සහ තවත් බොහෝ බියජනක දේවල් ... Btw, obj[0]අනවශ්‍ය බව පෙනේ, objපෙරනිමි අවස්ථා වලදී (?) හොඳින් ක්‍රියා කරන බව පෙනේ .
akavel

ස්තූතියි. මම මෙම ගෞරවය JSON මුද්‍රණයට වඩා ටිකක් හොඳ කර ඇත්තෙමි:jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); sys.stdout.write(json.dumps($1))"; }
ඇඩම් කේ ඩීන්

4
obj[0]විග්‍රහ කිරීමේදී දෝෂයක් ඇති { "port":5555 }කරයි. ඉවත් කිරීමෙන් පසු හොඳින් ක්‍රියා [0]කරයි.
සයිබර් එඩ්

135

මාටින් ආර් සහ බොයිකෝගේ නායකත්වය අනුගමනය කරමින්:

$ curl -s 'http://twitter.com/users/username.json' | python -mjson.tool

එමඟින් ඔබට අතිශයින්ම මිත්‍රශීලී ප්‍රතිදානයක් ලැබෙනු ඇත. ඉතා පහසුයි:

$ curl -s 'http://twitter.com/users/username.json' | python -mjson.tool | grep my_key

38
OP අසන පරිදි ඔබ නිශ්චිත යතුරක් උකහා ගන්නේ කෙසේද?
ජුවාන්

2
මෙතෙක් ලබා දී ඇති හොඳම පිළිතුර, බොහෝ ඩිස්ට්‍රෝස් වල වෙනත් කිසිවක් ස්ථාපනය කිරීමට අවශ්‍ය නොවන අතර ඔබට හැකිය | grep field. ස්තූතියි!
ඇන්ඩ්‍රියා රිචාර්ඩි

7
මේ සියල්ල කරන්නේ මා වරදවා වටහා නොගන්නේ නම් JSON සංයුති කිරීමයි. Xpath විසඳුමක් මෙන් හෝ "JSON Pointer" මත පදනම් වූ යමක් ප්‍රතිදානයෙන් නිශ්චිත ක්ෂේත්‍රයක් තෝරා ගැනීමට ඇමතුම්කරුට එය ඉඩ නොදේ.
චීසෝ

4
මම අවසන් වන්නේ යතුරු අගය යුගලයක් සමඟ මිස එහි වටිනාකම නොවේ.
ක්‍රිස්ටෝපර්

1
jqපයිතන් සිටියදී සාමාන්‍යයෙන් ස්ථාපනය කර නොමැත. එසේම, ඔබ පයිතන් වෙත ගිය පසු ඔබටත් import json...
එයම

128

ඔබ විය හැකි බාගත jqඔබේ වේදිකාව සඳහා ද්විමය (සහ ලකුණු chmod +x jq):

$ curl 'https://twitter.com/users/username.json' | ./jq -r '.name'

එය "name"json වස්තුවෙන් ගුණාංග උපුටා ගනී.

jqමුල් පිටුව පවසන්නේ එය sedJSON දත්ත සඳහා සමාන බවයි.


28
වාර්තාව jqසඳහා පමණක් විස්මිත මෙවලමකි.
හෝස්

2
එකඟ විය. පිළිගත් පිළිතුරෙන් මට jsawk සමඟ සැසඳිය නොහැක, නමුත් මම එය භාවිතා කර නැත, නමුත් දේශීය අත්හදා බැලීම් සඳහා (මෙවලමක් ස්ථාපනය කිරීම පිළිගත හැකි තැනක) මම jq නිර්දේශ කරමි. මෙන්න තරමක් පුළුල් උදාහරණයකි, එය අරාවෙහි එක් එක් මූලද්‍රව්‍යය ගෙන තෝරාගත් දත්ත සමඟ නව JSON වස්තුවක් සංස්ලේෂණය කරයි: curl -s https://api.example.com/jobs | jq '.jobs[] | {id, o: .owner.username, dateCreated, s: .status.state}'
jbyler

2
මේකට ආදරෙයි. ඉතා සැහැල්ලු බරක් වන අතර එය පැරණි සී වල ඇති බැවින් එය ඕනෑම තැනක සම්පාදනය කළ හැකිය.
බෙන් ජේකොබ්ස්

1
වඩාත්ම ප්‍රායෝගික එක: එයට තෙවන පාර්ශවීය පුස්තකාල අවශ්‍ය නොවේ (jsawk කරන අතරතුර) සහ ස්ථාපනය කිරීම පහසුය (OSX:
brew

2
මගේ භාවිතය සඳහා වඩාත් ප්‍රායෝගික හා පහසුවෙන් ක්‍රියාත්මක කළ හැකි පිළිතුර මෙයයි. උබුන්ටු (14.04) පද්ධතිය සඳහා සරල apt-get install jq මෙවලම මගේ පද්ධතියට එක් කළේය. මම AWS CLI ප්‍රතිචාර වලින් JSON ප්‍රතිදානය jq වෙතට යොමු කරමි. ප්‍රතිචාරයේ කූඩු කර ඇති සමහර යතුරු සඳහා අගයන් උකහා ගැනීම ඉතා හොඳය.
බ්‍රැන්ඩන් කේ

107

Node.js භාවිතා කිරීම

පද්ධතිය තිබේ නම් ස්ථාපනය කර ඇති අතර, අවශ්‍ය ඕනෑම අගයක් ඉවතට ගැනීම සඳහා -pමුද්‍රණ -eධජ භාවිතා කර ස්ක්‍රිප්ට් ධජ භාවිතා කළ හැකිය JSON.parse.

JSON නූල භාවිතා කර { "foo": "bar" }"foo" හි අගය ඉවත් කිරීම සඳහා සරල උදාහරණයක් :

$ node -pe 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
bar

අපට ප්‍රවේශය catසහ වෙනත් උපයෝගිතා ඇති බැවින්, අපට මෙය ගොනු සඳහා භාවිතා කළ හැකිය:

$ node -pe 'JSON.parse(process.argv[1]).foo' "$(cat foobar.json)"
bar

හෝ JSON අඩංගු URL වැනි වෙනත් ආකෘතියක්:

$ node -pe 'JSON.parse(process.argv[1]).name' "$(curl -s https://api.github.com/users/trevorsenior)"
Trevor Senior

1
ස්තූතියි! නමුත් මගේ node -p -e 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
කාරණයේදී

33
පයිප්ප! curl -s https://api.github.com/users/trevorsenior | node -pe "JSON.parse(require('fs').readFileSync('/dev/stdin').toString()).name"
nicerobot

4
මෙය මගේ ප්‍රියතම විසඳුමයි; ස්වාභාවික (JSON) දත්ත ව්‍යුහයක් විග්‍රහ කිරීමට භාෂාවක් (javascript) භාවිතා කරන්න. වඩාත්ම නිවැරදි බව පෙනේ . එසේම - නෝඩ් බොහෝ විට දැනටමත් පද්ධතියෙන් ලබා ගත හැකි අතර, ඔබට jq හි ද්විමය සමඟ සම්බන්ධ වීමට සිදු නොවේ (එය තවත් නිවැරදි තේරීමක් සේ පෙනේ ).
එලිරන් මල්කා

මෙය bash ස්ක්‍රිප්ට් ශ්‍රිතයයි: # jsonv නිශ්චිත ගුණාංගයක් සඳහා json වස්තු අගය ලබා ගන්න # පළමු පරාමිතිය json ලේඛනය # දෙවන පරාමිතිය යනු ආපසු ලබා දිය යුතු ගුණාංගය get_json_attribute_value () {node -pe 'JSON.parse (ක්‍රියාවලිය. argv [1]) [process.argv [2]] '"$ 1" "$ 2"}
යෞවනය

7
Node.js 10 සමඟ පහත ක්‍රියා කරයි:cat package.json | node -pe 'JSON.parse(fs.readFileSync(0)).version'
ඉල්යා බෝයැන්ඩින්

102

භාවිතය Python හි JSON සහාය awk භාවිතා වෙනුවට!

මේ වගේ දෙයක්:

curl -s http://twitter.com/users/username.json | \
    python -c "import json,sys;obj=json.load(sys.stdin);print obj['name'];"

7
හොඳ ප්‍රතිචාරයක් දැක්වීමට උත්සාහ කිරීම ගැන මට සමාව දෙන්න ...: මම වඩාත් උත්සාහ කරමි. පක්ෂග්‍රාහීත්වයට එය ඉවත් කිරීම සඳහා අමුතු පිටපතක් ලිවීමට වඩා වැඩි යමක් අවශ්‍ය වේ!
මාර්ටින්

9
එම ඔනෙලයිනර් විසඳුමේ ඔබ obj විචල්‍යය භාවිතා කරන්නේ ඇයි? එය නිෂ් less ල වන අතර කෙසේ හෝ ගබඩා නොවේද? json.load(sys.stdin)['"key']"වැනි උදාහරණ භාවිතා කරමින් ඔබ අඩුවෙන් ලියයි : curl -sL httpbin.org/ip | python -c "import json,sys; print json.load(sys.stdin)['origin']".
m3nda

69

ඔබ පාමුලට වෙඩි තබන්නේ කෙසේදැයි ඔබ විමසා ඇති අතර උණ්ඩ සැපයීමට මම මෙහි සිටිමි:

curl -s 'http://twitter.com/users/username.json' | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^text/ {print $2}'

tr -d '{}'ඒ වෙනුවට ඔබට භාවිතා කළ හැකිය sed. නමුත් ඒවා සම්පූර්ණයෙන්ම අත්හැර දැමීමෙන් අපේක්ෂිත ප්‍රති have ල ඇති බව පෙනේ.

ඔබට පිටත උපුටා දැක්වීම් ඉවත් කිරීමට අවශ්‍ය නම්, ඉහත ප්‍රති the ලය නල මාර්ගයෙන් නල කරන්න sed 's/\(^"\|"$\)//g'

මම හිතන්නේ අනෙක් අය ප්‍රමාණවත් අනතුරු ඇඟවීමක් කර තිබෙනවා. මම ගිලන් රථයක් ඇමතීමට ජංගම දුරකථනයක් සමඟ සිටිමි. සූදානම් වන විට ගින්න.


11
මේ ආකාරයෙන් පිස්සුව බොරු ය, මෙය කියවන්න: stackoverflow.com/questions/1732348/…
වැඩිදුර දැනුම් දෙන තුරු විරාමය.

3
මම සියලු පිළිතුරු කියවා ඇති අතර මෙය අතිරේක පරායත්තතාවයකින් තොරව මට හොඳින් ක්‍රියා කරයි. +1
eth0

ඒකයි මම හොයන්නේ. උපුටා දැක්වීම් ඉවත් කිරීම සඳහා ලබා දී ඇති එකම නිවැරදි කිරීම සපයන ලද විධානය මට වැඩ කළේ නැත, මම ඒ වෙනුවට sed 's / "// g' භාවිතා කර ඇත
AlexG

44

පයිතන් සමඟ බෑෂ් භාවිතා කිරීම

ඔබගේ .bash_rc ගොනුවේ bash ශ්‍රිතයක් සාදන්න

function getJsonVal () { 
    python -c "import json,sys;sys.stdout.write(json.dumps(json.load(sys.stdin)$1))"; 
}

ඉන්පසු

$ curl 'http://twitter.com/users/username.json' | getJsonVal "['text']"
My status
$ 

මෙන්න එකම කාර්යය, නමුත් දෝෂ පරීක්ෂා කිරීම සමඟ.

function getJsonVal() {
   if [ \( $# -ne 1 \) -o \( -t 0 \) ]; then
       cat <<EOF
Usage: getJsonVal 'key' < /tmp/
 -- or -- 
 cat /tmp/input | getJsonVal 'key'
EOF
       return;
   fi;
   python -c "import json,sys;sys.stdout.write(json.dumps(json.load(sys.stdin)$1))";
}

එහිදී $ # -ne 1 අවම වශයෙන් ආදානය 1 ක් වත්, -t 0 ඔබ පයිප්පයකින් හරවා යවන බවට වග බලා ගන්න.

මෙම ක්‍රියාවට නැංවීමේ ඇති හොඳ දෙය නම් ඔබට කැදැලි json අගයන් වෙත ප්‍රවේශ විය හැකි අතර ඒ වෙනුවට json ලබා ගත හැකිය! =)

උදාහරණයක්:

$ echo '{"foo": {"bar": "baz", "a": [1,2,3]}}' |  getJsonVal "['foo']['a'][1]"
2

ඔබට සැබවින්ම විසිතුරු වීමට අවශ්‍ය නම්, ඔබට දත්ත මුද්‍රණය කළ හැකිය:

function getJsonVal () { 
    python -c "import json,sys;sys.stdout.write(json.dumps(json.load(sys.stdin)$1, sort_keys=True, indent=4))"; 
}

$ echo '{"foo": {"bar": "baz", "a": [1,2,3]}}' |  getJsonVal "['foo']"
{
    "a": [
        1, 
        2, 
        3
    ], 
    "bar": "baz"
}

curl http://foo | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["environment"][0]["name"]'
Bash

1
sys.stdout.write()ඔබට එය පයිතන් 2 සහ 3 යන දෙකම සමඟ වැඩ කිරීමට අවශ්‍ය නම්
ජොහැන්සන්

මම හිතන්නේ එය system.stdout.write (obj $ 1) ට වෙනස් විය යුතුයි. ඒ ආකාරයෙන් ඔබට මෙසේ පැවසිය හැකිය: get චෙසෝගේ උදාහරණය මෙන් getJsonVal "['පරිසරය]] [' නම ']"
ජෝ හෙමින්

1
@ නාරෙක් එවැනි අවස්ථාවකදී මෙය පෙනෙනු ඇත: ශ්‍රිතයgetJsonVal() { py -x "json.dumps(json.loads(x)$1, sort_keys=True, indent=4)"; }
ජෝ හෙමින්

31

ටික්ටික් යනු JSON විග්‍රහකයකි (<කේත පේළි 250)

කතුවරයාගේ ලිපියේ කුඩා කොටස මෙන්න , බාෂ් JSON ට සහය දක්වන ලෝකයක් ගැන සිතන්න :

#!/bin/bash
. ticktick.sh

``  
  people = { 
    "Writers": [
      "Rod Serling",
      "Charles Beaumont",
      "Richard Matheson"
    ],  
    "Cast": {
      "Rod Serling": { "Episodes": 156 },
      "Martin Landau": { "Episodes": 2 },
      "William Shatner": { "Episodes": 2 } 
    }   
  }   
``  

function printDirectors() {
  echo "  The ``people.Directors.length()`` Directors are:"

  for director in ``people.Directors.items()``; do
    printf "    - %s\n" ${!director}
  done
}   

`` people.Directors = [ "John Brahm", "Douglas Heyes" ] ``
printDirectors

newDirector="Lamont Johnson"
`` people.Directors.push($newDirector) ``
printDirectors

echo "Shifted: "``people.Directors.shift()``
printDirectors

echo "Popped: "``people.Directors.pop()``
printDirectors

2
මෙහි ඇති එකම ශක්තිමත් පිරිසිදු පිළිතුර ලෙස, මෙය තවත් ඉහළ නැංවිය යුතුය.
එඩ් රැන්ඩල්

මෙම පුද්ගලයින්ගේ විචල්‍යය නැවත json නූලකට මුද්‍රණය කිරීමට ක්‍රමයක් තිබේද? එය අතිශයින්ම ප්‍රයෝජනවත් වනු ඇත
තෝමස් ෆෝර්නෙට්

1
අවසාන වශයෙන් පයිතන් හෝ වෙනත් කුරිරු ක්‍රම නිර්දේශ නොකරන පිළිතුරක් ... ස්තූතියි!
අකිටෝ

22

ස්වදේශීය බෑෂ් අනුවාදය: බැක්ස්ලෑෂ් (\) සහ මිල ගණන් (") සමඟද හොඳින් ක්‍රියා කරයි

function parse_json()
{
    echo $1 | \
    sed -e 's/[{}]/''/g' | \
    sed -e 's/", "/'\",\"'/g' | \
    sed -e 's/" ,"/'\",\"'/g' | \
    sed -e 's/" , "/'\",\"'/g' | \
    sed -e 's/","/'\"---SEPERATOR---\"'/g' | \
    awk -F=':' -v RS='---SEPERATOR---' "\$1~/\"$2\"/ {print}" | \
    sed -e "s/\"$2\"://" | \
    tr -d "\n\t" | \
    sed -e 's/\\"/"/g' | \
    sed -e 's/\\\\/\\/g' | \
    sed -e 's/^[ \t]*//g' | \
    sed -e 's/^"//'  -e 's/"$//'
}


parse_json '{"username":"john, doe","email":"john@doe.com"}' username
parse_json '{"username":"john doe","email":"john@doe.com"}' email

--- outputs ---

john, doe
johh@doe.com

මේක නම් නියමයි. නමුත් JSON නූලට ඊමේල් යතුරකට වඩා තිබේ නම්, විග්‍රහකයා john@doe.com ප්‍රතිදානය කරනු ඇත "" john@doe.com
rtc11

Jean-pierre@email.com වැනි විද්‍යුත් තැපෑලෙහි ඉරක් තිබේ නම් එය ක්‍රියා නොකරයි
alexmngn

21

PHP CLI සමඟ JSON විග්‍රහ කිරීම

මාතෘකාවෙන් බැහැරව ඇති නමුත් ප්‍රමුඛත්වය රජකම් කරන බැවින් අපගේ විශ්වාසවන්ත සහ විශ්වාසවන්ත PHP ගැන සඳහන් නොකර මෙම ප්‍රශ්නය අසම්පූර්ණව පවතී, මම හරිද?

JSON එකම උදාහරණය භාවිතා කරමින් අපැහැදිලි බව අඩු කිරීම සඳහා එය විචල්‍යයකට පැවරීමට ඉඩ දෙයි.

$ export JSON='{"hostname":"test","domainname":"example.com"}'

දැන් PHP යහපත්කම සඳහා, file_get_contents සහ php: // stdin stream wrapper භාවිතා කරන්න.

$ echo $JSON|php -r 'echo json_decode(file_get_contents("php://stdin"))->hostname;'

හෝ භාවිතයෙන් උල් පිටතට ලෙස fgets හා පාබල නියත වන විටත් විවෘත අංශයෙන් STDIN .

$ echo $JSON|php -r 'echo json_decode(fgets(STDIN))->hostname;'

n ජෝයි!


ඔබට $argnඒ වෙනුවට භාවිතා කළ හැකියfgets(STDIN)
IcanDivideBy0

අපොයි, $argn-E හෝ -R ධජය සමඟ ක්‍රියා කරන අතර JSON අන්තර්ගතය එක් පේළියක තිබේ නම් පමණි ...
IcanDivideBy0

13

රූබි සහ http://flori.github.com/json/ භාවිතා කරන අනුවාදය

$ < file.json ruby -e "require 'rubygems'; require 'json'; puts JSON.pretty_generate(JSON[STDIN.read]);"

හෝ වඩාත් සංක්ෂිප්තව:

$ < file.json ruby -r rubygems -r json -e "puts JSON.pretty_generate(JSON[STDIN.read]);"

3
මෙය මගේ ප්‍රියතම ය;) BTW ඔබට පුස්තකාලය අවශ්‍ය වන පරිදි රූබි-ආර්ජොන් සමඟ කෙටි කළ හැකිය
ලුකැපෙට්

;රූබී හි අවසාන තරඟය අවශ්‍ය නොවන බව සලකන්න (එය සාමාන්‍යයෙන් වෙනම රේඛාවල තනි පේළියකට සමාන වන ප්‍රකාශයන් සංයුක්ත කිරීම සඳහා පමණි).
සැක් මොරිස්

12

අවාසනාවකට මෙන් ඉහළ භාවිතා, එම පිළිතුර ඡන්දය grepප්රතිලාභ පූර්ණ මගේ තත්වය තුළ වැඩ කටයුතු කළේ නැත එම තරගයේදී, එහෙත් ඔබ දන්නවා නම්, JSON ආකෘතිය ඔබට භාවිතා කළ හැකි නියතව පවතිනු ඇත lookbehind හා lookahead පමණක් අපේක්ෂිත අගයන් ලබා ගැනීම සඳහා.

# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="FooBar":")(.*?)(?=",)'
he\"llo
# echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="TotalPages":)(.*?)(?=,)'
33
#  echo '{"TotalPages":33,"FooBar":"he\"llo","anotherValue":100}' | grep -Po '(?<="anotherValue":)(.*?)(?=})'
100

ඔබ කවදාවත් ඇත්තටම දන්නේ ඉතා JSON ශබ්ද කෝෂය තුළ අංග සඳහා. ඒවා අර්ථ දැක්වීම අනුව පිළිවෙලට නැත. ඔබේම JSON විග්‍රහකය පෙරළීම විනාශකාරී ප්‍රවේශයක් වීමට මෙය මූලික හේතුවකි.
ත්‍රිත්ව

10

යමෙකුට කැදැලි ව්‍යුහයන් අවශ්‍ය නොවී සරල JSON වස්තූන්ගෙන් අගයන් උකහා ගැනීමට අවශ්‍ය නම්, කඩාවැටීමකින් තොරව නිත්‍ය ප්‍රකාශන භාවිතා කළ හැකිය.

JSON ප්‍රමිතිය මත පදනම් වූ නිත්‍ය ප්‍රකාශන භාවිතා කරමින් මා විසින් අර්ථ දක්වන ලද ශ්‍රිතයක් මෙන්න :

function json_extract() {
  local key=$1
  local json=$2

  local string_regex='"([^"\]|\\.)*"'
  local number_regex='-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?'
  local value_regex="${string_regex}|${number_regex}|true|false|null"
  local pair_regex="\"${key}\"[[:space:]]*:[[:space:]]*(${value_regex})"

  if [[ ${json} =~ ${pair_regex} ]]; then
    echo $(sed 's/^"\|"$//g' <<< "${BASH_REMATCH[1]}")
  else
    return 1
  fi
}

Caveats: වස්තු සහ අරා අගය ලෙස සහය නොදක්වයි, නමුත් ප්‍රමිතියේ අර්ථ දක්වා ඇති අනෙකුත් සියලුම අගය වර්ග සඳහා සහය දක්වයි. එසේම, JSON ලේඛනයේ කොතරම් ගැඹුරු වුවත් යුගලයක් ගැලපෙන්නේ හරියටම එකම යතුරු නාමයක් ඇති තාක් කල් ය.

OP ගේ උදාහරණය භාවිතා කිරීම:

$ json_extract text "$(curl 'http://twitter.com/users/username.json')"
My status

$ json_extract friends_count "$(curl 'http://twitter.com/users/username.json')"
245

හෙල්ඩර් පෙරෙයිරා අපට මෙම ශ්‍රිතය සමඟ කැදැලි දේපල අගයන් උකහා ගත හැකිද?
එදිරිව

9

දැන් පවර්ෂෙල් හරස් වේදිකාවක් බැවින්, මම සිතුවේ එය තරමක් දුරට බුද්ධිමත් හා අතිශය සරල බව මට පෙනී යන හෙයිනි.

curl -s 'https://api.github.com/users/lambda' | ConvertFrom-Json 

ConvertFrom-Json විසින් JSON පවර්ෂෙල් අභිරුචි වස්තුවක් බවට පරිවර්තනය කරයි, එම නිසා ඔබට එම ස්ථානයේ සිට ඉදිරියට ඇති ගුණාංග සමඟ පහසුවෙන් වැඩ කළ හැකිය. ඔබට අවශ්‍ය වූයේ 'හැඳුනුම්පත' දේපල පමණි, ඔබ මෙය කරන්නේ:

curl -s 'https://api.github.com/users/lambda' | ConvertFrom-Json | select -ExpandProperty id

ඔබට බාෂ් තුළ සිට සියල්ලම ආයාචනා කිරීමට අවශ්‍ය නම්, ඔබට එය මේ ආකාරයට හැඳින්විය යුතුය:

powershell 'curl -s "https://api.github.com/users/lambda" | ConvertFrom-Json'

ඇත්ත වශයෙන්ම කරකැවිල්ලකින් තොරව එය කිරීමට පිරිසිදු පවර්ෂෙල් ක්‍රමයක් ඇත, එය වනුයේ:

Invoke-WebRequest 'https://api.github.com/users/lambda' | select -ExpandProperty Content | ConvertFrom-Json

අවසාන වශයෙන්, අභිරුචි වස්තුවක් JSON වෙත පහසුවෙන් පරිවර්තනය කරන 'ConvertTo-Json' ද ඇත. මෙන්න උදාහරණයක්:

(New-Object PsObject -Property @{ Name = "Tester"; SomeList = @('one','two','three')}) | ConvertTo-Json

මේ වගේ ලස්සන JSON නිපදවන:

{
"Name":  "Tester",
"SomeList":  [
                 "one",
                 "two",
                 "three"
             ]

}

යුනික්ස් හි වින්ඩෝස් කවචයක් භාවිතා කිරීම තරමක් පරිශුද්ධ දෙයක් බව පිළිගත යුතුය, නමුත් පවර්ෂෙල් සමහර දේවල ඇත්තෙන්ම හොඳයි, සහ JSON සහ XML විග්‍රහ කිරීම ඒවායින් කිහිපයක්. හරස් වේදිකා අනුවාදය සඳහා මෙය GitHub පිටුව https://github.com/PowerShell/PowerShell


ඉහළට ඔසවා ඇත්තේ ඔබ නව මයික්‍රොසොෆ්ට් ක්‍රමෝපාය ඔවුන්ගේ මෙවලම් විවෘත-මූලාශ්‍රය සඳහා ප්‍රවර්ධනය කරන නිසා සහ විවෘත මූලාශ්‍ර විදේශීය මෙවලම් ඒකාබද්ධ කරන බැවිනි. එය අපේ ලෝකයට හොඳ දෙයක්.
ඇලෙක්ස්

මම පවර්ෂෙල්ට අකමැති විය, නමුත් JSON වස්තූන් ඉතා හොඳ බැවින් හැසිරවීම පිළිගත යුතුය.
MartThé

9

Json නූලකින් දේපලක් ලබා ගැනීමට පහසු ක්‍රමයක් තිබේ. package.jsonඋදාහරණයක් ලෙස ගොනුවක් භාවිතා කරමින් මෙය උත්සාහ කරන්න:

#!/usr/bin/env bash
my_val="$(json=$(<package.json) node -pe "JSON.parse(process.env.json)['version']")"

අප භාවිතා process.envකරන්නේ අනිෂ්ට අන්තර්ගතයන් ඒවායේ උපුටා දැක්වීමෙන් ගැලවී කේතයක් ලෙස විග්‍රහ කිරීමෙන් අනතුරකින් තොරව ගොනුවේ අන්තර්ගතය node.js වෙතට නූලක් ලෙස ලබා ගන්නා බැවිනි.


කේත ලෙස විග්‍රහ කරන ලද නූලකට අගයන් ආදේශ කිරීම සඳහා නූල් සම්මුතියක් භාවිතා කිරීම අත්තනෝමතික node.js කේතය ක්‍රියාත්මක කිරීමට ඉඩ දෙයි, එයින් අදහස් වන්නේ ඔබ අන්තර්ජාලයෙන් ඉවත් වූ අහඹු අන්තර්ගතයන් සමඟ භාවිතා කිරීම අතිශයින්ම අනාරක්ෂිත බවයි. ජාවාස්ක්‍රිප්ට් හි JSON විග්‍රහ කිරීමට ආරක්ෂිත / හොඳම-ප්‍රායෝගික ක්‍රම තිබේ, එය තක්සේරු නොකරන්න.
චාල්ස් ඩෆි

Har චාර්ල්ස් ඩෆි මා අනුගමනය කරන බවට විශ්වාස නැත, නමුත් JSON.parse ඇමතුම ආරක්ෂිත විය යුතුය, require()ඇත්ත වශයෙන්ම විදේශ කේතය ධාවනය කළ හැකි පරිදි, JSON.parse හට නොහැක.
ඇලෙක්සැන්ඩර් මිල්ස්

ඔබේ නූල ඇත්ත වශයෙන්ම JSON ධාවන වේලාවට එන්නත් කර ඇත්නම් එය සත්‍යයකි. මෙහි කේතය විශ්වාසදායක ලෙස කරන බවක් මට නොපෙනේ. පරිසරයක් විචල්ය සිට එය අදින්න හා එය සමත් JSON.parse()මෙතන හා ඔව්, ඔබ මැනවින් ආරක්ෂිතයි කියලා ... ඒත්, මේ JSON ධාවන ඇත ලබා ඇති (විශ්වාස) කේතය සමඟ-කණ්ඩායමක් (විශ්වාසදායී නොවන) අන්තර්ගතය.
චාල්ස් ඩෆි

... ඒ හා සමානව, ඔබේ කේතය JSON ගොනුවේ සිට නූලක් ලෙස කියවා එම නූලට යොමු කරන්නේ නම් JSON.parse(), ඔබත් ආරක්ෂිතයි, නමුත් එයද මෙහි සිදු නොවේ.
චාල්ස් ඩෆි

2
... ආහ්, හෙක්, වහාම "කෙසේද" වෙත යන්නට පුළුවන. ගැටළුව වන්නේ ඔබ සම්මත කිරීමට අදහස් කරන ෂෙල් විචල්‍යය JSON.parse()කේතයට ආදේශ කිරීමයි . ඔබ උපකල්පනය කරන්නේ වචනාර්ථයෙන් බැක්ටික්ස් දැමීමෙන් අන්තර්ගතය වචනානුසාරයෙන් පවතිනු ඇති බවයි, නමුත් එය සම්පූර්ණයෙන්ම අනාරක්ෂිත උපකල්පනයකි, මන්ද යත්, ගොනු අන්තර්ගතයේ (සහ ඒ අනුව විචල්‍යය) වචනාර්ථයෙන් බැක්ටික්ස් පැවතිය හැකි අතර, එමඟින් උපුටා දැක්වීම අවසන් කර, උපුටා නොගත් සන්දර්භයකට ඇතුළු විය හැකිය. අගයන් කේතයක් ලෙස ක්‍රියාත්මක වේ.
චාල්ස් ඩෆි

6

Xml ලිපිගොනු ඇති අයෙකුට මගේ Xidel දෙස බැලීමට අවශ්‍ය විය හැකිය . එය ක්ලයි , පරායත්තතාවයෙන් තොර JSONiq ය ප්‍රොසෙසරයකි. (එනම් එය xml හෝ json සැකසුම් සඳහා XQuery සඳහා සහය දක්වයි)

ප්‍රශ්නයේ උදාහරණය වනුයේ:

 xidel -e 'json("http://twitter.com/users/username.json")("name")'

හෝ මගේම, සම්මත නොවන දිගු කිරීමේ සින්ටැක්ස් සමඟ:

 xidel -e 'json("http://twitter.com/users/username.json").name'

1
හෝ වර්තමානයේ සරලයි: xidel -s https://api.github.com/users/lambda -e 'name'(හෝ -e '$json/name', හෝ -e '($json).name').
රයිනෝ

6

මට මෙහි කිසිදු පිළිතුරක් භාවිතා කළ නොහැක. ලබා ගත හැකි jq, ෂෙල් අරා නැත, ප්‍රකාශයක් නැත, grep -P, බැලූ බැල්මට සහ බැලූ බැල්මට නැත, පයිතන්, පර්ල් නැත, රූබි නැත, නැත - බාෂ් පවා නැත ... ඉතිරි පිළිතුරු සරලව ක්‍රියා නොකරයි. ජාවාස්ක්‍රිප්ට් හුරුපුරුදු බව පෙනේ, නමුත් ටින් එක පවසන්නේ නෙස්කැෆේ - එබැවින් එය ද යන්නක් නැත :) මගේ සරල අවශ්‍යතාවය සඳහා වුවද - ඒවා අධික ලෙස හා මන්දගාමී වනු ඇත.

එහෙත්, මගේ මොඩමයේ json ආකෘතිගත පිළිතුරෙන් බොහෝ විචල්‍යයන් ලබා ගැනීම මට අතිශයින් වැදගත් ය. මම එය කරන්නේ මගේ රවුටර වලදී ඉතා කාර්යබහුල වූ කාර්යබහුල බොක්ස් ය. අවදිවීම පමණක් භාවිතා කිරීමේ ගැටළු නොමැත: පරිසීමක සකසා දත්ත කියවන්න. තනි විචල්යයක් සඳහා, එපමණයි!

awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "login") {print $4} }' test.json

මට අරා නොමැති බව මතකද? මට ෂෙල් ස්ක්‍රිප්ටයක අවශ්‍ය විචල්‍යයන් 11 ට අවලංගු විග්‍රහ කළ දත්ත ලබා දීමට සිදු විය. මා කොතැනක බැලූවත් එය කළ නොහැකි මෙහෙයුමක් යැයි කියනු ලැබේ. ඒ ගැනත් ප්‍රශ්නයක් නැහැ.

මගේ විසඳුම සරලයි. මෙම කේතය: 1) ප්‍රශ්නයෙන් .json ගොනුව විග්‍රහ කරන්න (ඇත්ත වශයෙන්ම, මම වැඩිපුරම උච්චාරණය කළ පිළිතුරෙන් වැඩ කරන දත්ත නියැදියක් ණයට ගෙන ඇත) සහ උපුටා ගත් දත්ත තෝරාගන්න, ප්ලස් 2) නොමිලේ නම් කරන ලද කවචය ලබා දෙමින් ෂෙල් විචල්‍යයන් නිර්මාණය කරන්න. විචල්ය නම්.

eval $( curl -s 'https://api.github.com/users/lambda' | 
awk ' BEGIN { FS="\""; RS="," };
{
    if ($2 == "login") { print "Login=\""$4"\"" }
    if ($2 == "name") { print "Name=\""$4"\"" }
    if ($2 == "updated_at") { print "Updated=\""$4"\"" }
}' )
echo "$Login, $Name, $Updated"

ඇතුළත හිස් තැන් සමඟ ගැටළු නොමැත. මගේ භාවිතයේදී, එකම විධානය මඟින් දිගු තනි පේළි ප්‍රතිදානයක් විග්‍රහ කරයි. Eval භාවිතා කරන බැවින්, මෙම විසඳුම සුදුසු වන්නේ විශ්වාසදායක දත්ත සඳහා පමණි. පිකප් නොකියවූ දත්ත වලට අනුවර්තනය වීම සරල ය. විශාල විචල්‍යයන් සංඛ්‍යාවක් සඳහා, වෙනත් නම් භාවිතා කර ආන්තික වේග ලාභයක් ලබා ගත හැකිය. අරාව නොමැතිකම පැහැදිලිවම අදහස් කරන්නේ: අමතර විකාරයකින් තොරව බහුවිධ වාර්තා නොමැත. නමුත් අරා ලබා ගත හැකි ස්ථානවල මෙම විසඳුම අනුවර්තනය වීම සරල කාර්යයකි.

ai මයිකල් සෙඩ් පිළිතුර බොහෝ දුරට ක්‍රියාත්මක වේ (නමුත් මට ඒ ගැන අදහස් දැක්විය නොහැක). මගේ මනාව ආකෘතිගත කරන ලද දත්ත සඳහා - එය ක්‍රියාත්මක වේ. මෙහි භාවිතා කර ඇති උදාහරණය සමඟ එතරම් නොවේ (නැතිවූ උපුටා දැක්වීම් එය ඉවත දමයි). එය සංකීර්ණ හා වෙනස් කිරීමට අපහසුය. ප්ලස්, විචල්යයන් 11 ක් උපුටා ගැනීම සඳහා ඇමතුම් 11 ක් කිරීමට මා කැමති නැත. මන්ද? මම විචල්යයන් 9 ක් උපුටා ගන්නා ලූප 100 ක් ගත කළෙමි: sed ශ්‍රිතය තත්පර 48.99 ක් ගත් අතර මගේ විසඳුම තත්පර 0.91 ක් ගතවිය! සාධාරණ නැද්ද? විචල්යයන් 9 ක තනි නිස්සාරණයක් කිරීම: 0.51 එදිරිව තත්පර 0.02.


5

ඔබට මේ වගේ දෙයක් උත්සාහ කළ හැකිය -

curl -s 'http://twitter.com/users/jaypalsingh.json' | 
awk -F=":" -v RS="," '$1~/"text"/ {print}'

5

ඔබට භාවිතා කළ හැකිය jshon:

curl 'http://twitter.com/users/username.json' | jshon -e text

වෙබ් අඩවිය මෙසේ කියයි: "වේගයෙන් දෙවරක්, මතකය 1/6 ක්" ... ඉන්පසු: "ජෝෂොන් විග්‍රහ කිරීම, කියවීම සහ නිර්මාණය කිරීම JSON grep / sed / awk මෙන්ම පර්ල් / පයිතන් වලින් සාදන ලද බර පංතියේ එක් පාර්සර්. ”
රොජර්

JSON Bash හි විග්‍රහ කිරීම සඳහා නිර්දේශිත විසඳුම ලෙස මෙය ලැයිස්තුගත කර ඇත
qodeninja

ප්‍රති result ලය වටා ඇති උපුටා දැක්වීම් ඉවත් කිරීමට ඇති පහසුම ක්‍රමය කුමක්ද?
gMale

5

ඉතා සරල නමුත් බලවත් JSON CLI සැකසුම් මෙවලමක් ද ඇත fx - https://github.com/antonmedv/fx

Bash පර්යන්තයේ JSON හැඩතල ගැන්වීමේ උදාහරණය

උදාහරණ

නිර්නාමික ශ්‍රිතය භාවිතා කරන්න:

$ echo '{"key": "value"}' | fx "x => x.key"
value

ඔබ නිර්නාමික ශ්‍රිතය සමත් නොවන්නේ නම් param => ... කේතය ස්වයංක්‍රීයව නිර්නාමික ශ්‍රිතයක් බවට පරිවර්තනය වේ. මෙම මූල පදය මඟින් ඔබට JSON වෙත ප්‍රවේශය ලබා ගත හැකිය:

$ echo '[1,2,3]' | fx "this.map(x => x * 2)"
[2, 4, 6]

නැතහොත් තිත් සින්ටැක්ස් ද භාවිතා කරන්න:

$ echo '{"items": {"one": 1}}' | fx .items.one
1

JSON අඩු කිරීම සඳහා ඔබට ඕනෑම නිර්නාමික කාර්යයන් සමත් විය හැකිය:

$ echo '{"items": ["one", "two"]}' | fx "this.items" "this[1]"
two

පැතිරීමේ ක්‍රියාකරු භාවිතයෙන් ඔබට දැනට පවතින JSON යාවත්කාලීන කළ හැකිය:

$ echo '{"count": 0}' | fx "{...this, count: 1}"
{"count": 1}

සරල ජාවාස්ක්‍රිප්ට් . නව වාක්‍ය ඛණ්ඩ ඉගෙන ගැනීමට අවශ්‍ය නැත.


යාවත්කාලීන කිරීම 2018-11-06

fxදැන් අන්තර්ක්‍රියාකාරී මාදිලියක් ඇත ( ! )

https://github.com/antonmedv/fx


7
ඔබ ඔබේම නිර්මාණයක් ප්‍රවර්ධනය කරන්නේ නම්, ඔබ ඒ පිළිබඳව පැහැදිළි විය යුතුය. ස්පෑම්කරුවෙකු නොවන්නේ කෙසේදැයි
ත්‍රිත්ව

4

මෙන්න ඔබට එය අවදි කළ හැකි එක් ක්‍රමයක්

curl -sL 'http://twitter.com/users/username.json' | awk -F"," -v k="text" '{
    gsub(/{|}/,"")
    for(i=1;i<=NF;i++){
        if ( $i ~ k ){
            print $i
        }
    }
}'

4

වඩාත් සංකීර්ණ JSON විග්‍රහ කිරීම සඳහා මම යෝජනා කරන්නේ පයිතන් jsonpath මොඩියුලය (ස්ටෙෆාන් ගොස්නර් විසිනි) -

  1. එය ස්ථාපනය කරන්න -

sudo easy_install -U jsonpath

  1. එය භාවිතා කරන්න -

උදාහරණ file.json ( http://goessner.net/articles/JsonPath වෙතින් ) -

{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}

එය විග්‍රහ කරන්න (සියලුම පොත් මාතෘකා මිල සමඟ උපුටා ගන්න <10) -

$ cat file.json | python -c "import sys, json, jsonpath; print '\n'.join(jsonpath.jsonpath(json.load(sys.stdin), 'store.book[?(@.price < 10)].title'))"

ප්‍රතිදානය කරයි -

Sayings of the Century
Moby Dick

සටහන: ඉහත විධාන රේඛාවේ දෝෂ පරීක්ෂා කිරීම ඇතුළත් නොවේ. දෝෂ පරීක්ෂාව සමඟ සම්පූර්ණ විසඳුම සඳහා ඔබ කුඩා පයිතන් ස්ක්‍රිප්ට් එකක් සෑදිය යුතු අතර උත්සාහය හැර කේතය ඔතා තිබිය යුතුය.


ලස්සන මෝඩය. මම පයිතන් පවා නොදනිමි, නමුත් මෙය ප්‍රබල විසඳුමක් සේ පෙනේ
ශ්‍රීධර් සර්නොබත්

ඒ වෙනුවට jsonpathස්ථාපනය කර ඇති විට මට සුළු ගැටලුවක් ඇති විය jsonpath_rw, එබැවින් ඉහත ක්‍රියා නොකරන්නේ නම් ඔබට උත්සාහ කළ හැකි සමාන දෙයක් මෙහි ඇත: 1) /usr/bin/python -m pip install jsonpath-rw2) cat ~/trash/file.json | /usr/bin/python -c "from jsonpath_rw import jsonpath, parse; import sys,json; jsonpath_expr = parse('store.book[0]'); out = [match.value for match in jsonpath_expr.find(json.load(sys.stdin))]; print out;"(මම පයිතන් ද්විමය සඳහා සම්පූර්ණ මාර්ගය භාවිතා කළෙමි. ස්ථාපනය කර ඇත).
ශ්‍රීධර් සර්නොබාත්

4

ඔබට php තිබේ නම් :

php -r 'var_export(json_decode(`curl http://twitter.com/users/username.json`, 1));'

උදාහරණයක් ලෙස:
අපට අයිසෝ කේත සමඟ json සපයන සම්පත් ඇත: http://country.io/iso3.json සහ අපට එය පහසුවෙන් කරකැවිල්ලකින් දැක ගත හැකිය:

curl http://country.io/iso3.json

නමුත් එය එතරම් පහසු නොවන අතර කියවිය නොහැකි, වඩා හොඳ විග්‍රහයක් සහ කියවිය හැකි ව්‍යුහය බලන්න:

php -r 'var_export(json_decode(`curl http://country.io/iso3.json`, 1));'

මෙම කේතය මෙවැනි දෙයක් මුද්‍රණය කරයි:

array (
  'BD' => 'BGD',
  'BE' => 'BEL',
  'BF' => 'BFA',
  'BG' => 'BGR',
  'BA' => 'BIH',
  'BB' => 'BRB',
  'WF' => 'WLF',
  'BL' => 'BLM',
  ...

ඔබ කැදැලි අරා තිබේ නම් මෙම ප්‍රතිදානය වඩා හොඳ වනු ඇත ...

මෙය ප්‍රයෝජනවත් වේ යැයි සිතමු ...


4

මෙය තවත් bash& pythonදෙමුහුන් පිළිතුරකි. මම මෙම පිළිතුර පළ කළේ මට වඩාත් සංකීර්ණ JSON ප්‍රතිදානය සැකසීමට අවශ්‍ය වූ නිසා, නමුත් මගේ බාෂ් යෙදුමේ සංකීර්ණතාව අඩු කිරීමෙනි. මම සිට පහත සඳහන් JSON වස්තුව විවෘත ඉරිතලා කිරීමට අවශ්ය http://www.arcgis.com/sharing/rest/info?f=json දී bash:

{
  "owningSystemUrl": "http://www.arcgis.com",
  "authInfo": {
    "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
    "isTokenBasedSecurity": true
  }
}

පහත දැක්වෙන උදාහරණයේ දී, මම මගේම ක්‍රියාත්මක කිරීම jqසහ unquoteඋත්තේජනය කිරීම නිර්මාණය කළෙමි python. අපි පයිතන් වස්තුව සිට jsonපයිතන් ශබ්දකෝෂයකට ආනයනය කළ පසු අපට ශබ්ද කෝෂය සැරිසැරීමට පයිතන් සින්ටැක්ස් භාවිතා කළ හැකි බව ඔබ සටහන් කරනු ඇත. ඉහත සැරිසැරීමට, වාක්‍ය ඛණ්ඩය:

  • data
  • data[ "authInfo" ]
  • data[ "authInfo" ][ "tokenServicesUrl" ]

බාෂ් තුළ මැජික් භාවිතා කිරීමෙන්, අපි dataඅතහැර දමා දත්තවල දකුණට පයිතන් පෙළ පමණක් සපයන්නෙමු , එනම්

  • jq
  • jq '[ "authInfo" ]'
  • jq '[ "authInfo" ][ "tokenServicesUrl" ]'

සටහන, කිසිදු පරාමිතියක් නොමැතිව, jqJSON pretifier ලෙස ක්‍රියා කරයි. පරාමිතීන් සමඟ අපට ශබ්දකෝෂයෙන් අවශ්‍ය ඕනෑම දෙයක් උපුටා ගැනීම සඳහා පයිතන් සින්ටැක්ස් භාවිතා කළ හැකිය.

ඉහත දැක්වෙන ක්‍රියාකාරී උදාහරණය මෙන්න:

jq_py() {
cat <<EOF
import json, sys
data = json.load( sys.stdin )
print( json.dumps( data$1, indent = 4 ) )
EOF
}

jq() {
  python -c "$( jq_py "$1" )"
}

unquote_py() {
cat <<EOF
import json,sys
print( json.load( sys.stdin ) )
EOF
}

unquote() {
  python -c "$( unquote_py )"
}

curl http://www.arcgis.com/sharing/rest/info?f=json | tee arcgis.json
# {"owningSystemUrl":"https://www.arcgis.com","authInfo":{"tokenServicesUrl":"https://www.arcgis.com/sharing/rest/generateToken","isTokenBasedSecurity":true}}

cat arcgis.json | jq
# {
#     "owningSystemUrl": "https://www.arcgis.com",
#     "authInfo": {
#         "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
#         "isTokenBasedSecurity": true
#     }
# }

cat arcgis.json | jq '[ "authInfo" ]'
# {
#     "tokenServicesUrl": "https://www.arcgis.com/sharing/rest/generateToken",
#     "isTokenBasedSecurity": true
# }

cat arcgis.json | jq '[ "authInfo" ][ "tokenServicesUrl" ]'
# "https://www.arcgis.com/sharing/rest/generateToken"

cat arcgis.json | jq '[ "authInfo" ][ "tokenServicesUrl" ]' | unquote
# https://www.arcgis.com/sharing/rest/generateToken

3

මම මෙය කර ඇති අතර, යම් අගයක් සඳහා json ප්‍රතිචාරයක් "විග්‍රහ කිරීම" පහත පරිදි වේ:

curl $url | grep $var | awk '{print $2}' | sed s/\"//g 

පැහැදිලිවම, මෙහි $ url ට්විටර් යූආර්එල් වන අතර, එම var සඳහා ප්‍රතිචාරය ලබා ගැනීම සඳහා text var "පෙළ" වනු ඇත.

ඇත්ත වශයෙන්ම, මම හිතන්නේ මම OP විසින් අතහැර දමා ඇති එකම දෙය නම් ඔහු සොයන නිශ්චිත විචල්‍යය සමඟ රේඛාව සඳහා grep කිරීමයි. අව්ක් පේළියේ දෙවන අයිතමය අල්ලා ගන්නා අතර, සෙඩ් සමඟ මම උපුටා දැක්වීම් ඉවත් කරමි.

මට වඩා බුද්ධිමත් කෙනෙකුට මුළු සිතීමම අවුල් සහගතව කළ හැකිය.

දැන්, ඔබට එය සියල්ලම කළ හැකිය:

curl $url | sed '/text/!d' | sed s/\"text\"://g | sed s/\"//g | sed s/\ //g

මේ නිසා, අවුලක් නැත, ග්‍රහණයක් නැත ... මම මීට පෙර ඒ ගැන නොසිතුවේ මන්දැයි මම නොදනිමි. හ්ම් ...


ඇත්ත වශයෙන්ම, sed සමඟ ඔබට කළ හැකිය
tonybaldwin

1
මෙම grep | awk | sedසහ sed | sed | sedනළ මාර්ග නාස්තිකාර antipatterns වේ. ඔබේ අන්තිම උදාහරණය පහසුවෙන් නැවත ලිවිය හැකි curl "$url" | sed '/text/!d;s/\"text\"://g;s/\"//g;s/\ //g'නමුත් අනෙක් අය පෙන්වා දී ඇති පරිදි, මෙය දෝෂ සහිත හා අස්ථාවර ප්‍රවේශයක් වන අතර එය මුලින් නිර්දේශ නොකළ යුතුය.
ත්‍රිත්ව

: |: ' "Sed' / \ n / ග්රෑම් S / නම \ curloutput" 'මම සුරකියි -oPz භාවිතා කිරීමට සිදු * \ "\" \ නම.?'
Ferroao

3

JSON විග්‍රහ කිරීම ෂෙල් පිටපතක වේදනාකාරී වේ. වඩාත් සුදුසු භාෂාවක් සමඟ, ෂෙල් ස්ක්‍රිප්ටින් සම්මුතීන්ට අනුකූල වන පරිදි JSON ගුණාංග උපුටා ගන්නා මෙවලමක් සාදන්න. ක්ෂණික ෂෙල් ස්ක්‍රිප්ටින් ගැටළුව විසඳීමට ඔබට ඔබගේ නව මෙවලම භාවිතා කළ හැකි අතර අනාගත තත්වයන් සඳහා එය ඔබගේ කට්ටලයට එක් කරන්න.

නිදසුනක් ලෙස, jsonlookup මෙවලමක් සලකා බලන්න, jsonlookup access token idඑය මා කියන්නේ නම්, එය stdin වෙතින් ආරෝපණ ප්‍රවේශය තුළ අර්ථ දක්වා ඇති ගුණාංග ටෝකනය තුළ අර්ථ දක්වා ඇති ගුණාංග හැඳුනුම්පත නැවත ලබා දෙනු ඇත , එය අනුමාන වශයෙන් JSON දත්ත වේ. ගුණාංගය නොපවතී නම්, මෙවලම කිසිවක් ලබා නොදේ (තත්වය 1 පිටවීම). විග්‍රහ කිරීම අසමත් වුවහොත්, තත්වය 2 පිටවීම සහ stderr වෙත පණිවිඩයක්. බැලීම සාර්ථක වුවහොත්, මෙවලම ගුණාංගයේ අගය මුද්‍රණය කරයි.

JSON අගයන් උකහා ගැනීමේ නිශ්චිත අරමුණ සඳහා යුනික්ස් මෙවලමක් නිර්මාණය කිරීමෙන් ඔබට එය පහසුවෙන් ෂෙල් ස්ක්‍රිප්ට් වලින් භාවිතා කළ හැකිය:

access_token=$(curl <some horrible crap> | jsonlookup access token id)

ඕනෑම භාෂාවක් jsonlookup ක්‍රියාත්මක කිරීම සඳහා කරනු ඇත. මෙන්න තරමක් සංක්ෂිප්ත පයිතන් අනුවාදයක්:

#!/usr/bin/python                                                               

import sys
import json

try: rep = json.loads(sys.stdin.read())
except:
    sys.stderr.write(sys.argv[0] + ": unable to parse JSON from stdin\n")
    sys.exit(2)
for key in sys.argv[1:]:
    if key not in rep:
        sys.exit(1)
    rep = rep[key]
print rep

3

පයිතන් භාවිතා කරන ලයිනර් දෙකකි. ඔබ තනි .sh ගොනුවක් ලියන්නේ නම් සහ වෙනත් .py ගොනුවක් මත යැපීමට ඔබට අවශ්‍ය නැතිනම් එය විශේෂයෙන් හොඳින් ක්‍රියාත්මක වේ. එමඟින් නල භාවිතය ද උත්තේජනය කරයි |. echo "{\"field\": \"value\"}"stsout වෙත json මුද්‍රණය කරන ඕනෑම දෙයක් මගින් ප්‍රතිස්ථාපනය කළ හැකිය.

echo "{\"field\": \"value\"}" | python -c 'import sys, json
print(json.load(sys.stdin)["field"])'

ප්‍රශ්නය පයිතන් විසඳුමක් සොයන්නේ නැත. අදහස් ද බලන්න.
ඇන්ඩ rew බාබර්

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.