| JSHON(1) | 1 (jshon manual) | JSHON(1) |
نام (NAME)
jshon —
تجزیهکننده
JSON برای شل
خلاصه دستور (SYNOPSIS)
jshon -[P|S|Q|V|C|I|0] [-F path]
-[t|l|k|u|p|a|j] -[s|n] value -[e|i|d] index
توضیحات (DESCRIPTION)
jshon
دادههای JSON
را تجزیه
کرده،
میخواند و
ایجاد
میکند. این
ابزار به
گونهای
طراحی شده
است که تا
جای ممکن در
محیط شل
قابل
استفاده
باشد و
جایگزین
تجزیهکنندههای
شکننده و
موقتی
ساختهشده
با grep/sed/awk و
همچنین
تکخطیهای
سنگین
نوشتهشده
با perl/python شود.
jshon متن json
را از stdin
بارگیری
میکند،
اقدامات را
انجام
میدهد و
سپس نتیجهٔ
آخرین
اقدام را در
stdout نمایش
میدهد.
برخی از
گزینهها
خروجی json
تولید
میکنند،
در حالی که
برخی دیگر
خلاصههای
متنی ساده
ارائه
میدهند. از
آنجا که Bash
ساختارهای
دادهٔ
تودرتوی
بسیار
ضعیفی
دارد، jshon
مانند یک
کتابخانهٔ
معمولی، JSON
را به عنوان
یک شیء بومی
بازنمیگرداند.
در عوض،
jshon
تاریخچهای
از
ویرایشها
را در یک
پشته (stack) نگه
میدارد و
شما
بالاترین
عنصر JSON را
دستکاری
میکنید.
عملیاتها (ACTIONS)
هر اقدام
به شکل یک
گزینهٔ
کوتاه است.
برخی از
آنها به
آرگومان
نیاز دارند.
در حالی که
نمونههای
متعددی از
jshon
میتوانند
با لوله (pipe) به
یکدیگر
متصل شوند،
اقدامات
باید به
صورت
متوالی
زنجیرهای
شوند تا
تعداد
فراخوانیها
کاهش یابد.
تمام
مثالها از
این نمونه json
استفاده
میکنند:
{"a":1,"b":[true,false,null,"str"],"c":{"d":4,"e":5}}
jshon [actions] < sample.json
بیشتر
استفادههای
رایجِ
فقطخواندنی
تنها به
چندین
اقدام -e و
یک اقدام
-a در میان
آنها نیاز
خواهند
داشت.
-t- (نوع / type) یکی
از مقادیر
string، object، array، number، bool
یا null را
بازمیگرداند.
jshon -t -> object
-l- (طول / length) یک
عدد صحیح
بازمیگرداند.
فقط روی string، object
و array کار
میکند.
jshon -l -> 3
-k- (کلیدها / keys)
فهرستی از
کلیدها را
که با خط
جدید از هم
جدا
شدهاند
بازمیگرداند.
فقط روی object
کار میکند.
jshon -k -> a b c
-e index- (استخراج / extract)
مقدار json در
"index" مورد
نظر را
بازمیگرداند.
فقط روی object و array
کار میکند.
اندیس یک
آرایه یک
عدد صحیح
است.
jshon -e c -> {"d":4,"e":5}
-a- (سرتاسری / across)
اقدامات
باقیمانده
را روی تمام
عناصرِ
عنصر
انتخابشده
نگاشت
میکند. فقط
روی objectها و
arrayها کار
میکند.
فراخوانیهای
متعدد
-aمیتوانند به صورت تودرتو باشند، هرچند نیاز به این کار در عمل نادر است.jshon -e b -a -t -> bool bool null string
-s value- (رشته / string) یک
رشتهٔ
کدگذاریشده
به صورت json
بازمیگرداند.
بعداً
میتواند
در یک
ساختار
موجود درج (-i)
شود.
jshon -s "back\slash" -> "back\\slash"
-n value- (غیررشته/عدد
/ nonstring/number) یک عنصر json
بازمیگرداند.
بعداً
میتواند
در یک
ساختار
موجود درج (-i)
شود. مقادیر
معتبر
عبارتند از
'true'، 'false'، 'null'، 'array'،
'object'، اعداد
صحیح و ممیز
شناور.
اختصارات t،
f، n، [] و {} نیز
به ترتیب
کار
میکنند.
jshon -n object -> {}
-u- (رشتهزدایی
/ unstring) یک رشتهٔ
رمزگشاییشده
بازمیگرداند.
فقط روی
انواع ساده
کار میکند:
string، int، real، boolean، null.
jshon -e b -e 3 -u -> str
-j- (لفظی json / json literal) خروجی json کدگذاریشده بازمیگرداند. روی تمام انواع کار میکند، هرچند برای string، array و object بیشترین کاربرد را دارد.
-p- (برداشتن از
پشته / pop)
آخرین
دستکاری را
از پشته
برمیدارد
و تاریخچه
را به عقب
بازمیگرداند.
برای
استخراج
چندین
مقدار از یک
شیء مفید
است.
jshon -e c -e d -u -p -e e -u -> 4 5
-d index- (حذف / delete) یک
مورد را در
یک آرایه یا
شیء حذف
میکند.
اندیسهای
منفی آرایه
از انتها
دور
میزنند.
jshon -d b -> {"a":1,"c":{"d":4,"e":5}}
-i index- (درج / insert)
پیچیده است.
معکوس extract است.
اقدام extract یک
زیرعنصر json
را روی پشته
قرار
میدهد.
اقدام insert یک
زیرعنصر را
از پشته
برمیدارد
و آن بخش از json
را در
آرایه/شیء
بزرگتر
زیرین درج
میکند. از extract
برای ورود
به عمق درخت
json، از delete/string/nonstring
برای اعمال
تغییرات و
از insert برای
بازگرداندن
تغییرات به
داخل درخت
استفاده
کنید.
jshon -e a -i a -> the orginal json
jshon -s one -i a -> {"a":"one", ...}با آرایهها به روش خاصی رفتار میشود. ارسال اعداد صحیح، یک مقدار را بدون رونویسی (overwrite) درج میکند. اعداد صحیح منفی و همچنین رشتهٔ 'append' قابل قبول هستند. برای بازنویسی یک مقدار در یک آرایه: اندیس را حذف (delete) کنید، مقدار جدید را با
-n/sایجاد کنید و سپس در آن اندیس درج نمایید.jshon -e b -d 0 -s q -i 0 -> {"b":"q",false,null,"str"}
گزینههای غیردستکاری (NON-MANIPULATION)
چندین گزینهٔ متا وجود دارند که مستقیماً json را ویرایش نمیکنند. این گزینهها را در هر بار فراخوانی حداکثر یک بار استفاده کنید.
-F <path>- (فایل / file) به جای stdin، از یک فایل میخواند. این تنها گزینهٔ غیردستکاری است که آرگومان میگیرد.
-P- (jsonp) پیش از ادامهٔ عادی کار، کالبک jsonp را حذف میکند.
-S- (مرتبسازی / sort) به جای ترتیب اصلی، دادهٔ json را مرتبشده بر اساس کلید بازمیگرداند.
-Q- (بیصدا / quiet) گزارش خطا در stderr را غیرفعال میکند، تا مجبور نباشید در سراسر اسکریپت خود از "2> /dev/null" استفاده کنید.
-V- (با مقدار / by-value)
ارسال با
مقدار (pass-by-value) را
روی پشتهٔ
تاریخچهٔ
ویرایش
فعال
میکند. در
موارد حاد
با هزاران
مقدار به
شدت
تودرتو،
این کار
ممکن است
منجر به این
شود که
jshonچندین برابر کندتر اجرا شده و چندین برابر حافظهٔ بیشتری مصرف کند. با این حال by-value ایمنتر از by-reference است و معمولاً رفتار غیرمنتظرهٔ کمتری ایجاد میکند. به طور پیشفرض by-reference فعال است زیرا در طول عملیات فقطخواندنی هیچ خطری ندارد و عموماً ویرایش json را راحتتر میسازد.jshon -e c -n 7 -i d -p -> c["d"] == 7
jshon -V -e c -n 7 -i d -p -> c["d"] == 5
jshon -V -e c -n 7 -i d -i c -> c["d"] == 7با
-V، تغییرات باید به صورت دستی دوباره در طول پشته درج شوند، به جای اینکه صرفاً مقادیر میانی از پشته برداشته (pop) شوند. -C- (ادامه / continue) در صورت بروز خطاهای بالقوه قابل جبران ادامه میدهد. برای مثال، استخراج مقادیری که وجود ندارند، به جای لغو اجرا، مقدار 'null' را به پشتهٔ ویرایش اضافه میکند. این رفتار ممکن است در آینده تغییر کند.
-I- (درجا / in-place) ویرایش درجا در فایل. نیازمند یک فایل برای تغییر است و بنابراین فقط با -F کار میکند. این گزینه برای اعمال تغییرات جزئی در یک فایل json در نظر گرفته شده است. هنگام استفاده، خروجی عادی غیرفعال شده و پایینترین عنصر پشتهٔ ویرایش در فایل نوشته میشود.
-0- (جداکنندههای تهی / null delimiters) جداکنندهٔ -u را از خط جدید به یک نویسهٔ null تغییر میدهد. این گزینه تنها بر -u اثر میگذارد زیرا فقط در این حالت ممکن است یک خط جدید به طور مجاز در خروجی ظاهر شود.
--version- یک برچسب زمانی به صورت YYYYMMDD را بازمیگرداند و خارج میشود.
ابزارهای دیگر (OTHER TOOLS)
jshon
همیشه در هر
خط یک فیلد
خروجی
میدهد.
بسیاری از
ابزارهای
یونیکس
انتظار
چندین فیلد
با
جداکنندهٔ
تب (tab) در هر خط
را دارند.
برای رفع
این مشکل،
خروجی را از
طریق لوله
به 'paste'
بفرستید. با
این حال، paste
نمیتواند
خطوط خالی
را مدیریت
کند،
بنابراین
آنها را با
یک
جاینگهدار
پر کنید. در
اینجا یک
مثال آورده
شده است:
jshon ... | sed 's/^$/-/' | paste -s -d '\t\t\n'
این دستور خطوط خالی را با '-' جایگزین کرده و هر سه خط را در یک خط ادغام میکند.
ستونها را میتوان با یک حلقهٔ while نیز استخراج کرد و همزمان به راحتی در متغیرها بارگذاری نمود:
while {
read -r var1
read -r var2
read -r var3
}; do [thing with vars]
done < <(jshon ...)
اگر از 'read' به همراه -0 استفاده میکنید، توجه داشته باشید که read (دستور داخلی bash) از IFS پیروی نمیکند. در عوض از این دستور استفاده کنید:
read -r -d $'\0' var1
روز به روز
ابزارهای
بیشتری
خروجی json
تولید
میکنند.
اغلب این
ابزارها از
یک ترکیب
خطمحورِ
json/متنساده
استفاده
میکنند که
در آن هر خط
یک ساختار
مستقل json است.
متأسفانه
این بدان
معناست که
خروجی به
عنوان یک
کل، یک json
معتبر نیست.
میتوانید
یا با حلقه
دادهها را
خط به خط
پیمایش
کنید (و jshon
را برای هر
خط یک بار
فراخوانی
کنید) یا
اینکه آن را
به یک
آرایهٔ
معتبر json
تبدیل
نمایید. به
عنوان
مثال:
while read line; do jshon <<< "$line"; done < <(journalctl -o json)
journalctl -o json | sed -e '1i[' -e '$!s/$/,/' -e '$a]' | jshon
کدگلف (GOLF)
اگر به
دستورات
تکخطی
بسیار
کوتاه
علاقهمندید،
در صورتی که
ابهامی
ایجاد نشود
میتوان
آرگومانها
را فشرده
کرد. مثالِ
-p(op) را
میتوان به
صورت زیر
فشرده (golf)
کرد:
jshon -e c -e d -u -p -e e -u == jshon -ec -ed -upee -u
انجام این کار را توصیه نمیکنم (فهمیدن دستور را بسیار دشوارتر میکند)، اما برخی افراد با وجود پیامدهایش، کدها را فشرده میکنند.
نویسندگان (AUTHORS)
jshon توسط
Kyle Keen ⟨keenerd@gmail.com⟩
همراه با
وصلههایی
از Dave Reisner
⟨d@falconindy.com⟩, AndrewF
(BSD، OSX، jsonp،
مرتبسازی)،
و Jean-Marc A (solaris)
نوشته شده
است.
گزارش باگها (BUGS)
بسیار زیاد! اعداد اعشاری ممیز شناور ممکن است دقت خود را از دست بدهند. استفاده از آن میتوانست راحتتر باشد. مستندات مختصر است.
| September 1, 2013 | Linux 6.12.113+deb13-amd64 |