ইউনিক্স সরঞ্জামগুলির সাথে জেএসএনকে পার্সিং করা হচ্ছে


877

আমি 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
বিটডব্লিউ পার্সিং করা ভাল জারসন নয় ... স্ট্রিংগুলিতে পালানোর চরিত্রগুলি সম্পর্কে কী বলা যায় ... ইত্যাদি এটার জন্য একটি অজগর উত্তর আছে (এমনকি একটি পার্ল উত্তরও ...)?
মার্টিনার

51
যে কোনও সময় "সমস্যা এক্স সহজেই অন্য ভাষার সাথে সমাধান করা যেতে পারে ওয়াই," এর কোড "আমার সরঞ্জাম বাক্সে নখ চালানোর জন্য কেবল একটি রক আছে ... অন্য কিছুর সাথে কেন বিরক্ত করবেন?"
ব্রায়ানএইচ

22
@BryanH: কখনও কখনও ভাষা ওয়াই ছাড়া করতে আরো সমাধানের জন্য নির্দিষ্ট সমস্যার এক্স কয়টি ভাষায় ব্যক্তি ওয়াই প্রস্তাব জানে নির্বিশেষে সজ্জিত করা হবে।
jfs

14
কিন্ডা দেরীতে, তবে এখানে যায়। grep -Po '"'"version"'"\s*:\s*"\K([^"]*)' package.json। এই সমাধান টাস্ক সহজে & শুধুমাত্র সঙ্গে , grep এবং সহজ JSONs জন্য পুরোপুরি কাজ করে। জটিল জেএসওএনগুলির জন্য আপনার সঠিক পার্সার ব্যবহার করা উচিত।
ডায়োসনি

2
@ কারণ, আপনি কি শিরোনামে "সেড এবং অ্যাজক সহ" ইউনিক্স সরঞ্জামগুলির সাথে "এডিট" পরিবর্তন করে ঠিক করবেন?
চার্লস ডাফি

উত্তর:


1125

কমান্ড লাইন থেকে জেএসওএন পরিচালনার উদ্দেশ্যে বিশেষত অনেকগুলি সরঞ্জাম প্রস্তুত করা হয়েছে এবং এটি অ্যাওউকের সাথে করার চেয়ে অনেক সহজ এবং নির্ভরযোগ্য হবে যেমন jq:

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

jsonমডিউলটি ব্যবহার করে পাইথনের মতো আপনার সিস্টেমে ইতিমধ্যে ইনস্টল থাকা সরঞ্জামগুলির সাহায্যে আপনি এটিও করতে পারেন এবং যথাযথ জেএসওন পার্সারের সুবিধা থাকা সত্ত্বেও কোনও অতিরিক্ত নির্ভরতা এড়াতে পারেন। নিম্নলিখিতটি অনুমান করে আপনি ইউটিএফ -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']"

.তিহাসিক নোট

এই উত্তরটি মূলত jsawk এর জন্য প্রস্তাবিত , যা এখনও কাজ করা উচিত, তবে এটির তুলনায় আরও কিছুটা জটিল হয়ে উঠতে পারে jqএবং এটি একটি পৃথক জাভাস্ক্রিপ্ট ইন্টারপ্রেটার ইনস্টল করা উপর নির্ভর করে যা পাইথন ইন্টারপ্রেটারের চেয়ে কম সাধারণ, তাই উপরের উত্তরগুলি সম্ভবত পছন্দনীয়:

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

এই উত্তরটি প্রাথমিকভাবে প্রশ্ন থেকে টুইটার এপিআই ব্যবহার করেছে, তবে সেই এপিআই আর কাজ করে না, উদাহরণগুলি পরীক্ষা করার জন্য অনুলিপি করা শক্ত করে তোলে এবং নতুন টুইটার এপিআইতে এপিআই কী প্রয়োজন হয়, তাই আমি গিটহাব এপিআই ব্যবহার করতে চলেছি যা কোনটি এপিআই কী ছাড়াই সহজেই ব্যবহার করা যায়। মূল প্রশ্নের প্রথম উত্তরটি হ'ল:

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

7
@ থ্রাউ +1 এটি jsawk এর চেয়ে অনেক বেশি ভাল জেকিউ এটি সংগ্রহস্থল এবং ব্যবহারের পক্ষে সহজ সহজতে পাওয়া যায়। আমি উভয়কে কয়েক মিনিটের জন্য পরীক্ষা করেছিলাম, জেিকিউ এই যুদ্ধটি জিতেছে
সায়মন সাদোও

1
দ্রষ্টব্য যে পাইথন 2 এ, আপনি যদি অন্য কমান্ডে আউটপুটটি পাইপ করেন তবে printবিবৃতিটি সর্বদা ASCII তে এনকোড হবে কারণ আপনি পাইপটিতে পাইথন ব্যবহার করছেন। PYTHONIOENCODING=<desired codec>আপনার টার্মিনালের জন্য উপযুক্ত একটি আলাদা আউটপুট এনকোডিং সেট করতে কমান্ডটি সন্নিবেশ করুন । পাইথন 3 এ, ডিফল্টটি ইউটিএফ -8 এই ক্ষেত্রে ( print() ফাংশনটি ব্যবহার করে )।
মার্টিজন পিটারস

1
ব্রিউ ইনস্টল করা জকিউ
অ্যান্ডি

1
curl -sএর সমতুল্য curl --silent, যেখানে jq -rঅর্থ jq --raw-outputস্ট্রিং কোট ছাড়াই।
সার্জ স্ট্রোব্যান্ড ২

পাইথন -c "আমদানির অনুরোধসমূহ ; আর = অনুরোধসমূহ get । সরলতম!
নোট টুচি

276

কোনও নির্দিষ্ট কীটির জন্য মানগুলি দ্রুত বের করতে, আমি ব্যক্তিগতভাবে "গ্রেপ-ও" ব্যবহার করতে পছন্দ করি, যা কেবল রেগেক্সের ম্যাচটি দেয়। উদাহরণস্বরূপ, টুইটগুলি থেকে "পাঠ্য" ক্ষেত্রটি পেতে, এরকম কিছু:

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

এই রেজেক্স আপনি ভাবেন তার চেয়ে বেশি শক্তিশালী; উদাহরণস্বরূপ, এটি এম্বেড করা কমাযুক্ত স্ট্রিংগুলির সাথে জরিমানা করে এবং সেগুলির মধ্যে উদ্ধৃতি উদ্ধৃত করে। আমি মনে করি আরও কিছু কাজ করে আপনি এমন একটি তৈরি করতে পারেন যা বাস্তবে মানটি তোলার গ্যারান্টিযুক্ত, যদি এটি পরমাণু হয়। (এটিতে যদি বাসা বেঁধে থাকে তবে কোনও রেজেক্স অবশ্যই এটি করতে পারে না))

এবং আরও পরিষ্কার করার জন্য (স্ট্রিং মূল পলায়নের পালন যদিও) আপনি ভালো কিছু ব্যবহার করতে পারেন: | perl -pe 's/"text"://; s/^"//; s/",$//'। (আমি এই বিশ্লেষণের জন্য এটি করেছি ।)

সমস্ত ঘৃণাকারী যারা আপনাকে জোর দেয় তাদের কাছে আসল জেএসএন পার্সার ব্যবহার করা উচিত - হ্যাঁ, এটি নির্ভুলতার জন্য প্রয়োজনীয়, তবে

  1. সত্যিই দ্রুত বিশ্লেষণ করা, যেমন ডাটা ক্লিনিং বাগগুলি পরীক্ষা করার জন্য মানগুলি গণনা করা বা ডেটা সম্পর্কে সাধারণ অনুভূতি অর্জন করা, কমান্ড লাইনে কিছু আউট করা দ্রুত হয় is কোনও স্ক্রিপ্ট লেখার জন্য সম্পাদক খোলা বিভ্রান্তিকর।
  2. grep -oপাইথন স্ট্যান্ডার্ড jsonলাইব্রেরির চেয়ে তাত্পর্যপূর্ণ অর্ডারগুলি হ'ল কমপক্ষে টুইটের জন্য এটি করার সময় (যা প্রতিটি প্রতি 2 কেবি ডলার)। আমি নিশ্চিত না যে এটি ঠিক কারণেই jsonধীর হয়েছে কিনা (আমার কিছু সময় ইয়াজলের সাথে তুলনা করা উচিত); তবে নীতিগতভাবে, একটি রেজেক্স দ্রুত হওয়া উচিত কারণ এটি সীমাবদ্ধ অবস্থা এবং অনেক বেশি অপটিমাইজযোগ্য, পরিবর্তনের ক্ষেত্রে সমর্থনকারী পার্সারের পরিবর্তে এবং এই ক্ষেত্রে, আপনার যত্নশীল নয় এমন কাঠামোর জন্য প্রচুর সিপিইউ বিল্ডিং গাছ ব্যয় করে। (যদি কেউ একটি সীমাবদ্ধ স্টেট ট্রান্সডুসার লিখেছেন যা সঠিক (গভীরতা-সীমাবদ্ধ) জেএসএন পার্সিং করে থাকে তবে তা দুর্দান্ত হবে! এরই মধ্যে আমাদের "গ্রেপ -ও" রয়েছে।)

রক্ষণাবেক্ষণযোগ্য কোডটি লিখতে, আমি সর্বদা একটি বাস্তব পার্সিং লাইব্রেরি ব্যবহার করি। আমি jsawk চেষ্টা করে দেখিনি , তবে এটি যদি ভালভাবে কাজ করে তবে এটি পয়েন্ট # 1 কে সম্বোধন করবে।

সর্বশেষ, ওয়্যাকিয়ার, সমাধান: আমি একটি স্ক্রিপ্ট লিখেছিলাম যা পাইথন ব্যবহার করে jsonএবং ট্যাবগুলি দ্বারা পৃথককৃত কলামগুলিতে আপনি যে কীগুলি চান তা উত্তোলন করে; তারপরে আমি চারপাশে মোড়ক দিয়ে পাইপ করি awkযা কলামগুলিতে নাম অ্যাক্সেসের অনুমতি দেয়। এখানে: json2tsv এবং tsvawk স্ক্রিপ্ট । সুতরাং এই উদাহরণের জন্য এটি হবে:

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

এই পদ্ধতিটি # 2 কে সম্বোধন করে না, এটি একটি পাইথন স্ক্রিপ্টের চেয়ে বেশি অদক্ষ এবং এটি কিছুটা ভঙ্গুর: এটি স্ট্রিং মানগুলিতে নিউলাইন এবং ট্যাবগুলিকে সাধারণীকরণের জন্য জোর করে, বিশ্বের অ্যাডকের ক্ষেত্র / রেকর্ড-বিস্মৃত দর্শন দিয়ে দুর্দান্ত খেলতে। তবে এটি আপনাকে কমান্ড লাইনে থাকার চেয়ে আরও সঠিকতার সাথে থাকতে দেয় grep -o


11
আপনি পূর্ণসংখ্যার মানগুলি ভুলে গেছেন। grep -Po '"text":(\d*?,|.*?[^\\]",)'
রবার্ট

3
রবার্ট: ঠিক আছে, আমার রেজেক্স কেবল সেই ক্ষেত্রের স্ট্রিং মানগুলির জন্যই লেখা হয়েছিল। আপনার বলার মতো পূর্ণসংখ্যা যোগ করা যেতে পারে। আপনি যদি সমস্ত ধরণের চান তবে আপনার আরও বেশি করে করতে হবে: বুলিয়ান, নাল। এবং অ্যারে এবং অবজেক্টগুলির আরও বেশি কাজ প্রয়োজন; স্ট্যান্ডার্ড রেজেক্সের অধীনে কেবলমাত্র গভীরতা-সীমাবদ্ধ সম্ভব।
ব্রেন্ডন ওকননর

9
1. jq .nameকমান্ড-লাইনে কাজ করে এবং "স্ক্রিপ্ট লেখার জন্য সম্পাদক খোলার" প্রয়োজন হয় না। ২. আপনার
রেজেেক্স

6
এবং যদি আপনি কেবল মানগুলি চান তবে আপনি এটিতে কেবল বিশ্রীটি ফেলে দিতে পারেন। | grep -Po '"text":.*?[^\\]",'|awk -F':' '{print $2}'
জেফচার্টার

34
দেখে মনে হচ্ছে ওএসএক্স-এ -Pবিকল্পটি অনুপস্থিত। আমি ওএসএক্স 10.11.5 এ পরীক্ষা করেছি এবং grep --versionছিল grep (BSD grep) 2.5.1-FreeBSD। আমি এটি ওএসএক্সে "এক্সটেন্ডেড রেজেক্স" বিকল্পের সাথে কাজ করতে পেরেছি। উপরে থেকে কমান্ড হবে grep -Eo '"text":.*?[^\\]",' tweets.json
জেনস

174

যে কয়েকটি সুপারিশ এখানে (মন্তব্যে রইল) পাইথন ব্যবহারের পরামর্শ দিয়েছিল, সেই ভিত্তিতে আমি উদাহরণ খুঁজে না পেয়ে হতাশ হয়েছি।

সুতরাং, কিছু জেএসএন ডেটা থেকে একক মান পেতে এখানে একটি ওয়ান লাইনার। এটি ধরে নেওয়া হয় যে আপনি (কোথাও থেকে) ডেটা পাইপ করছেন এবং তাই স্ক্রিপ্টিং প্রসঙ্গে কার্যকর হওয়া উচিত।

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

ব্যাশ ফাংশনটি ব্যবহার করতে আমি নীচে এই উত্তরটি বাড়িয়েছি: কার্ল 'some_api' | জেজেসনওয়াল 'কী'
জো হেমিং

pythonpy( github.com/russell91/pythonpy প্রায় সর্বদা এর চেয়ে ভাল বিকল্প python -c, যদিও এটি পাইপ দিয়ে ইনস্টল করতে হবে just কেবল py --ji -x 'x[0]["hostname"]'জসনকে পাইপ করুন j আপনি যদি জসন_ইনপুট সমর্থন অন্তর্নির্মিত ব্যবহার না করতে চান তবে আপনি পেতে পারেন যারা স্বয়ংক্রিয়ভাবে আমদানি করেpy 'json.loads(sys.stdin)[0]["hostname"]'
রাসেলস্টয়ার্ট

2
ধন্যবাদ! আরও দ্রুত এবং নোংরা জেএসএন পার্সিংয়ের জন্য আমি এটিকে ব্যাশ ফাংশনে আবদ্ধ করেছি: 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)'এবং আরও অনুরূপ ভীতিজনক জিনিস ... বিটিডব্লু, obj[0]অপ্রয়োজনীয় বলে মনে হচ্ছে, এটি objডিফল্ট ক্ষেত্রে ঠিক ঠিক কাজ করে (?)।
উকভেল

ধন্যবাদ। আমি এই সম্মানটি JSON jsonq() { python -c "import sys,json; obj=json.load(sys.stdin); sys.stdout.write(json.dumps($1))"; }
কে

4
obj[0]পার্সিং করার সময় একটি ত্রুটি ঘটায় { "port":5555 }। অপসারণের পরে সূক্ষ্ম কাজ করে [0]
সাইবারএড

134

মার্টিনআর এবং বোয়েকোর নেতৃত্ব অনুসরণ করছেন:

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

এটি আপনাকে একটি অত্যন্ত গ্রেপ বান্ধব আউটপুট দেবে give খুব সুবিধাজনক:

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

37
ওপি যেমন জিজ্ঞাসা করছে আপনি কীভাবে একটি নির্দিষ্ট কী বের করবেন?
juan

2
এখন পর্যন্ত সেরা উত্তর ইমো, বেশিরভাগ ডিস্ট্রোজে আর কিছু ইনস্টল করার দরকার নেই এবং আপনিও পারেন | grep field। ধন্যবাদ!
আন্দ্রেয়া রিচিয়ার্দি

7
যদি আমি ভুল না করি তবে এগুলি সমস্তই JSON ফর্ম্যাট। এটি কলার আউটপুট থেকে কোনও নির্দিষ্ট ক্ষেত্র বাছাই করতে দেয় না, যেমন একটি এক্সপথ সমাধান, বা "জেএসএন পয়েন্টার" ভিত্তিক কিছু।
চিজো

4
আমি কেবল একটি মূল মান জুটি দিয়ে শেষ করছি, তবে মানটি নিজেই নয়।
ক্রিস্টোফার

1
jqপাইথন থাকাকালীন সাধারণত ইনস্টল করা হয় না। এছাড়াও, একবার পাইথনে গেলে import json...
আপনিও

125

আপনি কেবল আপনার প্ল্যাটফর্মের জন্য বাইনারি ডাউনলোডjq করতে এবং চালাতে পারেন ( chmod +x jq):

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

এটি "name"json অবজেক্ট থেকে অ্যাট্রিবিউট আহরণ করে।

jqহোমপেজটি এটি sedJSON ডেটার মতো বলে ।


27
কেবল রেকর্ডের জন্য, jqএকটি আশ্চর্যজনক সরঞ্জাম।
হোস

2
একমত। আমি গৃহীত উত্তর থেকে jsawk এর সাথে তুলনা করতে পারি না, কারণ আমি এটি ব্যবহার করি নি, তবে স্থানীয় পরীক্ষার জন্য (যেখানে কোনও সরঞ্জাম ইনস্টল করা গ্রহণযোগ্য) আমি জেককে সুপারিশ করি। এখানে আরও কিছুটা বিস্তৃত উদাহরণ, যা একটি অ্যারের প্রতিটি উপাদান নেয় এবং নির্বাচিত ডেটা সহ একটি নতুন জেএসওএন অবজেক্ট সংশ্লেষ করে: curl -s https://api.example.com/jobs | jq '.jobs[] | {id, o: .owner.username, dateCreated, s: .status.state}'
jbyler

2
এটা খুবই পছন্দ করি. খুব হালকা ওজন এবং এটি যেহেতু এটি পুরানো সি-তে রয়েছে, এটি প্রায় কোথাও সংকলিত হতে পারে।
বেন্মজ

1
সর্বাধিক ব্যবহারিক একটি: এটির জন্য তৃতীয় পক্ষের লাইব্রেরিগুলির প্রয়োজন নেই (যখন জাসউক করেন) এবং এটি ইনস্টল করা সহজ (ওএসএক্স: ব্রিউ ইনস্টল জ্যাকিউ)
লাউহুব

1
এটি আমার ব্যবহারের ক্ষেত্রে সবচেয়ে ব্যবহারিক এবং সহজেই প্রয়োগ করা উত্তর। উবুন্টু (১৪.০৪) সিস্টেমের জন্য একটি সহজ এপটি-গেইন ইনস্টল জেকিউ আমার সিস্টেমে এই সরঞ্জামটি যুক্ত করেছে। আমি জেএসএন এডাব্লুএস সিএলআই এর প্রতিক্রিয়াগুলি থেকে জেএসএন আউটপুটটি পাইপ করছি এবং প্রতিক্রিয়াতে নেস্ট করা কিছু কীগুলিতে মানগুলি বের করতে এটি দুর্দান্ত কাজ করে।
ব্র্যান্ডন কে

105

নোড.জেএস ব্যবহার করে

সিস্টেম থাকলে ইনস্টল করা হয়েছে, প্রয়োজনীয় কোনও মান টানতে -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

বা অন্য কোনও ফর্ম্যাট যেমন একটি ইউআরএল যা জেএসওএন রয়েছে:

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

1
ধন্যবাদ! তবে আমার ক্ষেত্রে এটি কেবল -e পতাকা নিয়ে কাজ করছেnode -p -e 'JSON.parse(process.argv[1]).foo' '{ "foo": "bar" }'
Rnd_d

33
পাইপ! curl -s https://api.github.com/users/trevorsenior | node -pe "JSON.parse(require('fs').readFileSync('/dev/stdin').toString()).name"
নিকরোবোট

4
এটি আমার প্রিয় সমাধান; এটি প্রাকৃতিক (জেএসএন) এমন একটি ডেটা-কাঠামো পার্স করার জন্য একটি ভাষা (জাভাস্ক্রিপ্ট) ব্যবহার করুন। সবচেয়ে মনে হয় সঠিক । এছাড়াও - নোড সম্ভবত সিস্টেমে ইতিমধ্যে উপলব্ধ, এবং আপনি jq এর বাইনেরিতে (যা অন্য মত দেখাচ্ছে সঙ্গে কাপড় ইস্ত্রী করা হবে না সঠিক পছন্দ)।
এলিরান মালকা

এটি বাশ স্ক্রিপ্ট ফাংশন: # জসনভ একটি নির্দিষ্ট বৈশিষ্ট্যের জন্য জসন বস্তুর মান পান # প্রথম প্যারামিটার হ'ল জসন ডকুমেন্ট # দ্বিতীয় প্যারামিটারটি এমন বৈশিষ্ট্য যা কোন মানটি get_json_attribute_value () {নোড -পে 'JSON.parse (প্রক্রিয়া) ফেরত পাঠাতে হবে। আরজিভি [১]) [প্রক্রিয়াআরগভ [২]] '"$ 1" "$ 2"}
ইউনেস

6
নিম্নলিখিতটি নোড.জেএস 10 নিয়ে কাজ করে:cat package.json | node -pe 'JSON.parse(fs.readFileSync(0)).version'
ইলিয়া বায়ানডিন

100

অজগর ব্যবহারের পরিবর্তে পাইথনের জেএসএন সমর্থন ব্যবহার করুন!

এটার মতো কিছু:

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

6
ভাল সাড়া জাগাতে চেষ্টা করার জন্য আমাকে ক্ষমা করুন ...: আমি আরও চেষ্টা করব। পার্টিশনশিপ এটিকে ঝেড়ে ফেলতে একটি awk স্ক্রিপ্ট লেখার চেয়ে আরও বেশি প্রয়োজন!
মার্টিনার

9
আপনি কেন এই অনিলাইনার সলিউশনে অবজেক্ট ভেরিয়েবল ব্যবহার করবেন? এটি অকেজো এবং যে কোনও উপায়ে সংরক্ষণ করা হয় না? আপনি কম ব্যবহার লিখতে json.load(sys.stdin)['"key']"মত উদাহরণ হিসাবে: curl -sL httpbin.org/ip | python -c "import json,sys; print json.load(sys.stdin)['origin']"
m3nda

64

কীভাবে নিজেকে পায়ে গুলি করতে হবে আপনি জিজ্ঞাসা করেছেন এবং আমি বারুদ সরবরাহ করতে এখানে এসেছি:

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

আপনি tr -d '{}'পরিবর্তে ব্যবহার করতে পারে sed। তবে এগুলি পুরোপুরি বাইরে বেরিয়ে যাওয়ার ফলে পছন্দসই প্রভাব রয়েছে বলে মনে হয়।

আপনি যদি বাইরের উক্তিগুলি সরিয়ে দিতে চান তবে উপরের ফলাফলটি পাইপ করুন sed 's/\(^"\|"$\)//g'

আমি মনে করি অন্যরা যথেষ্ট পরিমাণে অ্যালার্ম বাজিয়েছে। আমি একটি অ্যাম্বুলেন্স কল করার জন্য একটি সেল ফোন দিয়ে দাঁড়িয়ে আছি। প্রস্তুত হলে আগুন।


10
এইভাবে পাগলামি মিথ্যা, এটি পড়ুন: stackoverflow.com/questions/1732348/…
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত

3
আমি উত্তরগুলি সমস্ত পড়েছি এবং এটি কোনও অতিরিক্ত নির্ভরতা ছাড়াই আমার পক্ষে নিখুঁতভাবে কাজ করে। +1
এথ0

এটাই আমি খুঁজছিলাম। উদ্ধৃতি অপসারণের জন্য একমাত্র সংশোধন - সরবরাহিত সেড কমান্ডটি আমার পক্ষে কাজ করে না, আমি পরিবর্তে
সেড

44

পাইথনের সাথে ব্যাশ ব্যবহার করা

আপনার .bash_rc ফাইলে একটি বাশ ফাংশন তৈরি করুন

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 নিশ্চিত করে নিন যে আপনি কোনও পাইপ থেকে পুনঃনির্দেশ করছেন।

এই বাস্তবায়ন সম্পর্কে দুর্দান্ত জিনিসটি হ'ল আপনি নেস্টেড জেসন মানগুলিতে অ্যাক্সেস করতে পারবেন এবং তার বিনিময়ে জসন পাবেন! =)

উদাহরণ:

$ 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"]'
চিজো

1
sys.stdout.write()যদি আপনি এটি অজগর 2 এবং 3 উভয়ের সাথেই কাজ করতে চান
জোহানসন

আমি ভাবছি এটির পরিবর্তিত হওয়া উচিত system.stdout.write ($ 1)। এইভাবে আপনি বলতে পারেন: getJsonVal "['পরিবেশ'] [[নাম ']" ", যেমন @ চিজোর উদাহরণ
জো হিমেং

1
@ নেরেক সেক্ষেত্রে এটি দেখতে এটির মতো হবে: ফাংশনgetJsonVal() { py -x "json.dumps(json.loads(x)$1, sort_keys=True, indent=4)"; }
জো হেইমিং

30

টিকটিক একটি জেএসওন পার্সার যা ব্যাশে লিখিত হয়েছে (কোডের <250 টি লাইনের)

এখানে তাঁর নিবন্ধ থেকে লেখকের স্নিপিট, এমন একটি বিশ্ব কল্পনা করুন যেখানে বাশ জেএসএনকে সমর্থন করে :

#!/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
এখানে একমাত্র শক্তিশালী খাঁটি-বাশ উত্তর হিসাবে, এটি আরও উন্নয়নের দাবিদার।
এড র্যান্ডাল

এই লোকগুলিকে আবার কোনও জসন স্ট্রিংয়ে মুদ্রণের কোনও উপায় আছে কি? এটি অত্যন্ত উপকারী হবে
থমাস ফোরনেট

অবশেষে একটি উত্তর পাইথন বা অন্যান্য নৃশংস পদ্ধতির প্রস্তাব দিচ্ছে না ... ধন্যবাদ!
আকিতো

21

পিএইচপি সিএলআইয়ের সাথে জেএসনকে পার্স করা হচ্ছে

তর্কাতীতভাবে বিষয় ছাড়াই কিন্তু যেহেতু অগ্রাধিকার রাজত্ব করে এই প্রশ্নটি আমাদের বিশ্বস্ত এবং বিশ্বস্ত পিএইচপি'র উল্লেখ ছাড়াই অসম্পূর্ণ থেকে যায়, আমি কি ঠিক বলছি?

একই উদাহরণটি JSON ব্যবহার করে তবে অস্পষ্টতা হ্রাস করতে এটি একটি পরিবর্তনশীলকে নির্ধারণ করতে দেয়।

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

এখন পিএইচপি মঙ্গলভাবের জন্য, ফাইল_জেট_কন্টেন্টস এবং পিএইচপি: // স্টিডিন স্ট্রিম মোড়ক ব্যবহার করে।

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

বা সিগিএর ধ্রুবক এসটিডিনে fgets এবং ইতিমধ্যে খোলা স্ট্রিম ব্যবহার করে নির্দেশিত হিসাবে ।

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

nJoy!


এমনকি আপনি এর $argnপরিবর্তে ব্যবহার করতে পারেনfgets(STDIN)
IcanDivideBy0

ওহো, $argn-E বা -R পতাকা নিয়ে কাজ করে এবং যদি কেবল JSON সামগ্রী একটি লাইনে থাকে ...
IcanDivideBy0

21

নেটিভ বাশ সংস্করণ: ব্যাকস্ল্যাশ (\) এবং কোটস (") এর সাথেও ভাল কাজ করে

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

এটা সত্যিই দারুন. তবে যদি জেএসএন স্ট্রিংয়ে একাধিক ইমেল কী থাকে তবে পার্সার john@doe.com "" john@doe.com
rtc11

Jean-pierre@email.com এর মত ইমেলের কোনও ড্যাশ থাকলে কাজ করে না
alexmngn

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
এটি আমার প্রিয়;) বিটিডাব্লু আপনি লাইব্রেরির জন্য রুবি-আরজসন দিয়ে সংক্ষিপ্ত করতে পারেন
লুচাপেট

নোট করুন যে ;রুবিতে ফাইনালটি প্রয়োজন হয় না (এটি কেবলমাত্র একত্রে বক্তব্যগুলির জন্য ব্যবহৃত হয় যা সাধারণত একক লাইনে পৃথক লাইনে থাকে)।
জ্যাক মরিস

11

দুর্ভাগ্যবশত শীর্ষ উত্তর ভোট দিয়েছেন যে ব্যবহারসমূহ 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- অভিধান উপাদানের ক্রম। তারা, সংজ্ঞা অনুসারে, নিরবচ্ছিন্ন। এটি আপনার নিজের জেএসএন পার্সারকে ঘূর্ণন করা একটি ডুমেড অ্যাপ্রোচ কারণ হ'ল স্পষ্টতই একটি মৌলিক কারণ।
ট্রিপলি

10

যদি কেউ নেস্টেড স্ট্রাকচারের প্রয়োজন ছাড়াই কেবল সাধারণ জেএসওএন অবজেক্ট থেকে মানগুলি বের করতে চায় তবে ব্যাশ ছাড়াই নিয়মিত এক্সপ্রেশন ব্যবহার করা সম্ভব।

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
}

ক্যাভেটস: অবজেক্টস এবং অ্যারেগুলি মান হিসাবে সমর্থিত নয়, তবে স্ট্যান্ডার্ডে সংজ্ঞায়িত অন্যান্য সমস্ত মান প্রকারগুলি সমর্থিত। এছাড়াও, জেএসওএন নথিতে যতটা গভীর থাকে ঠিক ততক্ষণ এটির মূল কী নাম থাকাকালীন কোনও জুড়ি মিলবে।

ওপির উদাহরণ ব্যবহার করে:

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

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

হেলদার পেরেরা কি আমরা এই ফাংশনটির সাহায্যে নেস্টেড সম্পত্তি মানগুলি বের করতে পারি?
ভার্সে

8

জসন স্ট্রিং থেকে সম্পত্তি পাওয়ার আরও সহজ উপায় আছে। package.jsonউদাহরণ হিসাবে একটি ফাইল ব্যবহার করে , এটি চেষ্টা করুন:

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

আমরা ব্যবহার করছি process.envকারণ এটি নোড.জেজে ফাইলের বিষয়বস্তুগুলিকে স্ট্রিং হিসাবে পেয়েছে কোনও দূষিত সামগ্রীর ঝুঁকি ছাড়াই তাদের উদ্ধৃতি থেকে বেরিয়ে যাওয়ার এবং কোড হিসাবে পার্স করা হচ্ছে।


কোডকে পার্স করা স্ট্রিংয়ের সাথে মানগুলি বিকল্প হিসাবে স্ট্রিং কনটেনটেশন ব্যবহার করে স্বেচ্ছাসেবী নোড.জেএস কোড চালানো যায় যার অর্থ আপনি ইন্টারনেট থেকে বেরিয়ে আসা এলোমেলো বিষয়বস্তু সহ এটি ব্যবহার করা অত্যন্ত সুরক্ষিত নয়। জাভাস্ক্রিপ্টে JSON পার্স করার নিরাপদ / সেরা-অনুশীলনের উপায়গুলি কেবল এটি মূল্যায়ন করবেন না।
চার্লস ডাফি

@ চার্লসডফি নিশ্চিত না যে আমি অনুসরণ করি তবে জাসন.পারস কলটি আরও নিরাপদ হওয়া উচিত, কারণ require()প্রকৃতপক্ষে বিদেশী কোড চালানো যেতে পারে, জেএসএন.পারস পারে না।
আলেকজান্ডার মিলস

পার্সারকে বাইপাস করার মতো এমনভাবে যদি আপনার স্ট্রিংটি আসলে JSON রানটাইমে ইনজেক্ট করা হয় তবে এটি সত্য। আমি এখানে কোডটি নির্ভরযোগ্যভাবে এটি করতে দেখছি না। পরিবেশের পরিবর্তনশীল থেকে এটিকে টানুন এবং এতে পাস করুন JSON.parse()এবং হ্যাঁ, আপনি নির্বিঘ্নে নিরাপদ ... তবে এখানে, জেএসএন রানটাইম (বিশ্বস্ত) কোড সহ ইন-ব্যান্ড (অবিশ্বস্ত) সামগ্রী পাচ্ছে
চার্লস ডাফি

... একইভাবে, যদি আপনার কোডটি ফাইল থেকে স্ট্রিং হিসাবে জেএসওএন পড়ে এবং সেই স্ট্রিংটি পাস করে JSON.parse()তবে আপনিও নিরাপদ হন, তবে এটি এখানেও ঘটছে না।
চার্লস ডাফি

1
... আহ, হ্যাক, ততক্ষণে "কীভাবে" যেতে পারে। সমস্যা হল আপনি শেল পরিবর্তনশীল, যা আপনি প্রেরণ করা মনস্থ বদলে করছি JSON.parse(), কোড মধ্যে । আপনি ধরে নিচ্ছেন যে আক্ষরিক ব্যাকটিকগুলি রাখলে বিষয়বস্তুগুলিকে আক্ষরিক রাখা হবে তবে এটি সম্পূর্ণরূপে অনিরাপদ অনুমান, কারণ আক্ষরিক ব্যাকটিকগুলি ফাইলের সামগ্রীতে (এবং এইভাবে পরিবর্তনশীল) উপস্থিত থাকতে পারে, এবং এইভাবে উদ্ধৃতিটি বন্ধ করতে পারে এবং এমন একটি অব্যর্থ প্রসঙ্গ প্রবেশ করতে পারে যেখানে মানগুলি কোড হিসাবে কার্যকর করা হয়।
চার্লস ডাফি

7

এখন যে পাওয়ারশেলটি ক্রস প্ল্যাটফর্ম, আমি ভেবেছিলাম যে আমি এটির বাইরে চলে যাব, যেহেতু আমি এটি মোটামুটি স্বজ্ঞাত এবং অত্যন্ত সহজ বলে মনে করি।

curl -s 'https://api.github.com/users/lambda' | ConvertFrom-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

অবশেষে, 'কনভার্টটো-জসন' রয়েছে যা একটি কাস্টম অবজেক্টকে জাস্টসকে খুব সহজেই রূপান্তর করে। এখানে একটি উদাহরণ:

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

যা এই জাতীয় সুন্দর JSON উত্পাদন করতে পারে:

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

}

স্বীকারযোগ্যভাবে, ইউনিক্সে উইন্ডোজ শেল ব্যবহার করা কিছুটা বিস্মৃতকর তবে পাওয়ারশেল কিছু বিষয়ে সত্যই ভাল, এবং জেএসওএন এবং এক্সএমএলকে পার্সিং করা তাদের মধ্যে কয়েকটি। ক্রস প্ল্যাটফর্ম সংস্করণ https://github.com/PowerShell/PowerShell এর জন্য এটি গিটহাব পৃষ্ঠা


আপগোটেড কারণ আপনি নতুন মাইক্রোসফ্ট কৌশলগুলি তাদের সরঞ্জামগুলি ওপেন-সোর্স করার জন্য প্রচার করছেন এবং ওপেন-সোর্স বিদেশী সরঞ্জামগুলি অন্তর্ভুক্ত করছেন। এটা আমাদের বিশ্বের জন্য ভাল জিনিস।
অ্যালেক্স

আমি পাওয়ারশেলকে অপছন্দ করতাম, তবে জেএসএনের হ্যান্ডলিংটি অবশ্যই স্বীকার করতে হবে কারণ বস্তুগুলি বেশ সুন্দর।
মার্টিনথ

6

যার এক্সএলএমএল ফাইল রয়েছে এমন কেউ আমার জিডেলটি দেখতে চাইতে পারেন । এটি একটি ক্লাইম , নির্ভরতা-মুক্ত জেএসোনিক প্রসেসর। (যেমন এটি এক্সএমএল বা জসন প্রসেসিংয়ের জন্য এক্সকুয়ারিকে সমর্থন করে)

প্রশ্নের উদাহরণটি হ'ল:

 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

আমি এখানে কোন উত্তর ব্যবহার করতে পারি না। কোনও জেকিউ, কোনও শেল অ্যারে, কোনও ডিক্লেয়ার, কোনও গ্রেপ -পি, কোনও লুকহাইন্ড এবং লুকহ্যাড, কোনও পাইথন, কোনও পার্ল, কোনও রুবি, না - এমনকি বাশও নেই ... বাকী উত্তরগুলি কেবল ভাল কাজ করে না। জাভাস্ক্রিপ্টটি পরিচিত মনে হয়েছিল, তবে টিনটি নেসক্যাফে বলেছে - তাই এটিও কোনও অগ্রগতি নয় :) এমনকি যদি সহজ পাওয়া যায় তবে আমার সাধারণ প্রয়োজনের জন্য - এগুলি ওভারকিল এবং ধীর গতির হবে।

তবুও, আমার মডেমের জসন ফর্ম্যাট উত্তর থেকে আমার পক্ষে অনেকগুলি পরিবর্তনশীল পাওয়া অত্যন্ত গুরুত্বপূর্ণ। আমি আমার রাউটারগুলিতে খুব ছাঁটাই ব্যাসিবক্সের সাথে এটি করছি! একা অজানা ব্যবহার করে কোনও সমস্যা নেই: কেবল ডিলিমিটার সেট করুন এবং ডেটা পড়ুন। একক ভেরিয়েবলের জন্য, এটাই!

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

মনে আছে আমার কোন অ্যারে নেই? শেল স্ক্রিপ্টে আমার যে 11 টি ভেরিয়েবলের দরকার তা আমাকে বিশদভাবে পার্সড ডেটাতে নির্ধারণ করতে হয়েছিল। আমি যেখানেই তাকালাম, বলা হয়েছিল এটি একটি অসম্ভব মিশন। এটি নিয়েও কোনও সমস্যা নেই।

আমার সমাধান সহজ। এই কোডটি করবে: ১) প্রশ্ন থেকে জেএসন ফাইলটি বিশ্লেষণ করবে (আসলে, আমি সর্বাধিক উত্সাহিত উত্তর থেকে একটি ওয়ার্কিং ডেটা নমুনা ধার নিয়েছি) এবং উদ্ধৃত ডেটা বেছে নেব, আরও ২) মুক্ত নামকরণ করা শেলকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে কিছু কিছু দেবে পরিবর্তনশীল নাম।

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 ব্যবহৃত হয়, এই সমাধানটি কেবল বিশ্বস্ত ডেটার জন্য উপযুক্ত। এটি অবিন্যস্ত ডেটা পিকআপের সাথে মানিয়ে নেওয়া সহজ। বিপুল সংখ্যক ভেরিয়েবলের জন্য, যদি অন্যটি ব্যবহার করে প্রান্তিক গতি লাভ করা যায়। অ্যারের অভাবের স্পষ্টতই অর্থ: অতিরিক্ত ফিডিং ছাড়া একাধিক রেকর্ড নেই। তবে যেখানে অ্যারে উপলব্ধ রয়েছে, এই সমাধানটি মানিয়ে নেওয়া একটি সহজ কাজ।

@ মাইকেল সেড উত্তর প্রায় কাজ করে (তবে আমি এটিতে কোনও মন্তব্য করতে পারি না)। আমার সুন্দর বিন্যাসিত ডেটার জন্য - এটি কাজ করে। এখানে ব্যবহৃত উদাহরণের সাথে এতটা নয় (অনুপস্থিত উদ্ধৃতিগুলি এটি ফেলে দেয়)) এটি জটিল এবং সংশোধন করা কঠিন। এছাড়াও 11 টি ভেরিয়েবলগুলি বের করতে 11 টি কল করা আমি পছন্দ করি না। কেন? আমি 9 টি ভেরিয়েবলগুলি বের করার 100 টি লুপ টাইম করেছি: সেড ফাংশনটি 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 মেমরি" ... এবং তারপরে: "Jshon পার্স করে, JSON কে পাঠ করে এবং তৈরি করে It এটি শেলটির মধ্যে থেকে যতটা সম্ভব ব্যবহারযোগ্য হতে পারে এবং এটি থেকে তৈরি ভঙ্গুর অ্যাডহক পার্সারগুলি প্রতিস্থাপন করে গ্রেপ / সেড / অ্যাজকের পাশাপাশি পার্ল / পাইথন থেকে তৈরি হেভিওয়েট ওয়ান-লাইন পার্সার ""
রজার

এটি বাশ
জেএসওন

ফলাফলের চারপাশে থাকা উদ্ধৃতিগুলি থেকে মুক্তি পাওয়ার সহজতম উপায় কী?
gMale

4

আপনি এটি করতে পারেন এমন এক উপায় এখানে k

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

আরও জটিল জেএসএন পার্সিংয়ের জন্য আমি পাইথন জসনপথ মডিউলটি ব্যবহার করার পরামর্শ দিচ্ছি (স্টেফান গয়েসনার দ্বারা) -

  1. এটি ইনস্টল করুন -

sudo easy_install -U jsonpath

  1. এটা ব্যবহার করো -

ফাইল.জসনের উদাহরণ ( 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_rw1): পরিবর্তে, তাই এখানে কিছু অনুরূপ যদি আপনি উপরে চেষ্টা করতে পারেন না কাজ নয় /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 -r 'var_export(json_decode(`curl http://twitter.com/users/username.json`, 1));'

উদাহরণস্বরূপ:
আমাদের সংস্থান রয়েছে যা দেশগুলির আইসো কোডগুলি জেসন সরবরাহ করে: 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

একটি খুব সাধারণ তবে শক্তিশালী JSON CLI প্রসেসিং সরঞ্জাম রয়েছে fx - https://github.com/antonmedv/fx

বাশ টার্মিনালে JSON ফর্ম্যাটিংয়ের উদাহরণ

উদাহরণ

বেনামে ফাংশন ব্যবহার করুন:

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

আপনি যদি বেনাম ফাংশন প্যারাম => ... পাস না করেন তবে কোড স্বয়ংক্রিয়ভাবে বেনামে ফাংশনে রূপান্তরিত হবে। এবং আপনি এই কীওয়ার্ড দ্বারা JSON এ অ্যাক্সেস পেতে পারেন:

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

অথবা কেবল ডট সিনট্যাক্সও ব্যবহার করুন:

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

আপনি জেএসওএন হ্রাস করার জন্য অজানা কয়েকটি কার্যক্রমে পাস করতে পারেন:

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

আপনি স্প্রেড অপারেটর ব্যবহার করে বিদ্যমান জেএসএন আপডেট করতে পারেন:

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

শুধু সরল জাভাস্ক্রিপ্ট । নতুন সিনট্যাক্স শেখার দরকার নেই।


আপডেট 2018-11-06

fxএখন ইন্টারেক্টিভ মোড আছে ( ! )

https://github.com/antonmedv/fx


7
আপনি যদি নিজের তৈরির প্রচার করে থাকেন তবে আপনাকে এ সম্পর্কে সুস্পষ্ট হওয়া দরকার। কীভাবে স্প্যামার হবেন না
ট্রিপলি

4

এই এখনও অন্য হয় bash& pythonসংকর উত্তর। আমি এই উত্তরটি পোস্ট করেছি কারণ আমি আরও জটিল জেএসএন আউটপুট প্রক্রিয়া করতে চেয়েছিলাম, তবে আমার বাশ অ্যাপ্লিকেশনটির জটিলতা হ্রাস করে। আমি এখান থেকে নিম্নোক্ত 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" ]'

দ্রষ্টব্য, কোনও পরামিতি ছাড়াই, jq JSON প্রিটিটিফায়ার হিসাবে কাজ করে। প্যারামিটারগুলির সাহায্যে আমরা অভিধান থেকে আমরা যে কী চাই তা উপশব্দ এবং অ্যারের উপাদানগুলিতে নেভিগেট সহ এক্সট্র্যাক্ট করতে পাইথন সিনট্যাক্স ব্যবহার করতে পারি।

এখানে একটি কার্যকারী উদাহরণ যা উপরে বর্ণিত:

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

আমি এটি করেছি, একটি নির্দিষ্ট মানের জন্য একটি জসন প্রতিক্রিয়া "পার্সিং" করেছি, নিম্নরূপ:

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

স্পষ্টতই, এখানে $ ইউআরএলটি টুইটার ইউআরএল হবে এবং var ভেরটি সেই ভেরির প্রতিক্রিয়া পেতে "পাঠ্য" হবে।

সত্যই, আমি মনে করি যে কেবলমাত্র আমি ওপি করছিলাম তা হ'ল নির্দিষ্ট ভেরিয়েবলের সাথে রেখার জন্য গ্রেপ করা উচিত। আওক লাইনে দ্বিতীয় আইটেমটি ধরে এবং সেডের সাথে আমি উদ্ধৃতিগুলি কেটে ফেলি।

আমার চেয়ে স্মার্ট কেউ সম্ভবত পুরো চিন্তা ভাবনা বা গ্রেপ দিয়ে করতে পারে।

এখন, আপনি কেবলমাত্র সেড দিয়ে এগুলি করতে পারেন:

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

এইভাবে, কোনও জৌলুস নেই, গ্রেপ নেই ... আমি কেন জানি না কেন আগে আমি তা ভেবে দেখিনি। হুমমম ...


আসলে,
সেড

1
grep | awk | sedএবং sed | sed | sedপাইপলাইনগুলি অযথা antipatterns হয়। আপনার শেষ উদাহরণটি সহজেই আবার লেখা যেতে পারে curl "$url" | sed '/text/!d;s/\"text\"://g;s/\"//g;s/\ //g'তবে অন্যরা যেমন নির্দেশ করেছে, এটি ত্রুটি-প্রবণ এবং ভঙ্গুর পদ্ধতির যা প্রথমে সুপারিশ করা উচিত নয়।
ট্রিপলি

আমাকে গ্রিপ -ওপিজেডের নাম to ": \"। *? \ "'কার্লআউটপুট | সেড / এস name নাম use": / \ n / জি' ব্যবহার করতে হয়েছিল
ফিরোও

3

শেল স্ক্রিপ্টে JSON পার্স করা বেদনাদায়ক। আরও উপযুক্ত ভাষার সাহায্যে, এমন একটি সরঞ্জাম তৈরি করুন যা শেল স্ক্রিপ্টিং কনভেনশনগুলির সাথে সামঞ্জস্যপূর্ণভাবে JSON বৈশিষ্ট্যগুলি বের করে। তাত্ক্ষণিক শেল স্ক্রিপ্টিং সমস্যা সমাধান করতে আপনি নিজের নতুন সরঞ্জামটি ব্যবহার করতে পারেন এবং তারপরে ভবিষ্যতের পরিস্থিতিতে এটি আপনার কিটে যুক্ত করতে পারেন।

উদাহরণস্বরূপ, একটি সরঞ্জামকে jsonlookup বিবেচনা করুন যাতে আমি যদি বলি যে jsonlookup access token idএটি বৈশিষ্ট্য অ্যাক্সেসের মধ্যে নির্ধারিত বৈশিষ্ট্য টোকেনের মধ্যে নির্ধারিত বৈশিষ্ট্য আইডি ফিরিয়ে দেবে যা সম্ভবত জেএসওএন ডেটা। যদি বৈশিষ্ট্যটি বিদ্যমান না থাকে তবে সরঞ্জামটি কিছুই দেয় না (প্রস্থানের স্থিতি 1)। পার্সিং ব্যর্থ হলে স্থিতি 2 এবং স্ট্ডারকে একটি বার্তা প্রস্থান করুন। যদি অনুসন্ধানটি সফল হয়, সরঞ্জামটি গুণকের মানটি মুদ্রণ করে।

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\"}"স্টডআউটে কোনও জসন মুদ্রণ করে যে কোনও কিছু প্রতিস্থাপন করা যেতে পারে।

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

প্রশ্নটি পাইথন সমাধান খুঁজছিল না। মন্তব্যগুলি দেখুন।
অ্যান্ড্রু বারবার

3

অজগরটির জন্য এটি একটি ভাল ইউজকেস :

curl 'http://twitter.com/users/username.json' | py 'json.load(sys.stdin)["name"]'

এমনকি ছোট, অজগর-সি মডিউল এখানে :) খুব সুন্দর।
m3nda
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.