
محرر دفق JSON
JJ هي أداة سطر الأوامر التي توفر طريقة سريعة وبسيطة لاسترداد أو تحديث القيم من مستندات JSON. إنه مدعوم من GJSON و SJSON تحت الغطاء.
إنه سريع لأنه يتجنب تحليل أقسام غير ذات صلة من JSON ، والتخطي عن القيم التي لا تنطبق ، ويتم إحباط بمجرد العثور على القيمة المستهدفة أو تحديثها.
brew install tidwall/jj/jj
make
أو قم بتنزيل ثنائي مبني مسبقًا لـ Linux أو OSX أو Windows أو FreeBSD.
$ jj -h
usage: jj [-v value] [-purOD] [-i infile] [-o outfile] keypath
examples: jj keypath read value from stdin
or: jj -i infile keypath read value from infile
or: jj -v value keypath edit value
or: jj -v value -o outfile keypath edit value and write to outfile
options:
-v value Edit JSON key path value
-p Make json pretty, keypath is optional
-u Make json ugly, keypath is optional
-r Use raw values, otherwise types are auto-detected
-n Do not output color or extra formatting
-O Performance boost for value updates
-D Delete the value at the specified key path
-l Output array values on multiple lines
-i infile Use input file instead of stdin
-o outfile Use output file instead of stdout
keypath JSON key path (like "name.last")
يستخدم JJ بناء جملة المسار لإيجاد القيم.
احصل على سلسلة:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.last
Smithاحصل على كتلة من JSON:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name
{ " first " : " Tom " , " last " : " Smith " }حاول الحصول على مفتاح غير موجود:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj name.middle
nullاحصل على قيمة السلسلة الخام:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -r name.last
" Smith "احصل على قيمة صفيف بواسطة الفهرس:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj friends.1
Jane هناك دعم لخطوط JSON باستخدام .. بادئة المسار. والتي عند تحديدها ، يعامل المستند متعدد الأبطال كصفيف.
على سبيل المثال:
{"name": "Gilbert", "age": 61}
{"name": "Alexa", "age": 34}
{"name": "May", "age": 57}
..# >> 4
..1 >> {"name": "Alexa", "age": 34}
..#.name >> ["Gilbert","Alexa","May"]
..#[name="May"].age >> 57
يحتوي بناء جملة المسار لإعداد القيم على بضع اختلافات صغيرة من الحصول على القيم.
يتم اكتشاف خيار -v value تلقائيًا كرقم أو منطقية أو فارغة أو سلسلة. يمكنك تجاوز الكشف التلقائي وإدخال JSON RAW من خلال تضمين خيار -r . هذا مفيد لكتل JSON الخام مثل الكائن أو المصفوفات أو السلاسل المسبقة.
تحديث القيمة:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v Andy name.first
{ " name " :{ " first " : " Andy " , " last " : " Smith " }}اضبط قيمة جديدة:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v 46 age
{ " age " :46, " name " :{ " first " : " Tom " , " last " : " Smith " }}حدد قيمة متداخلة جديدة:
$ echo ' {"name":{"first":"Tom","last":"Smith"}} ' | jj -v relax task.today
{ " task " :{ " today " : " relax " }, " name " :{ " first " : " Tom " , " last " : " Smith " }}استبدل قيمة الصفيف بواسطة الفهرس:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.1
{ " friends " :[ " Tom " , " Andy " , " Carol " ]}إلحاق صفيف:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.-1
{ " friends " :[ " Tom " , " Andy " , " Carol " , " Andy " ]}اضبط قيمة صفيف تتجاوز الحدود:
$ echo ' {"friends":["Tom","Jane","Carol"]} ' | jj -v Andy friends.5
{ " friends " :[ " Tom " , " Andy " , " Carol " ,null,null, " Andy " ]}اضبط كتلة خام من JSON:
$ echo ' {"name":"Carol"} ' | jj -r -v ' ["Tom","Andy"] ' friends
{ " friends " :[ " Tom " , " Andy " ], " name " : " Carol " }ابدأ وثيقة JSON الجديدة:
$ echo ' ' | jj -v ' Sam ' name.first
{ " name " :{ " first " : " Sam " }}حذف قيمة:
$ echo ' {"age":46,"name":{"first":"Tom","last":"Smith"}} ' | jj -D age
{ " name " :{ " first " : " Tom " , " last " : " Smith " }}حذف قيمة صفيف بواسطة الفهرس:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.0
{ " friends " :[ " Carol " ]}حذف العنصر الأخير في المصفوفة:
$ echo ' {"friends":["Andy","Carol"]} ' | jj -D friends.-1
{ " friends " :[ " Andy " ]} يمكن استخدام خيار -O عندما يتوقع المتصل وجود قيمة في Keypath المحددة بالفعل.
يمكن أن يؤدي استخدام هذا الخيار إلى تسريع عملية ما يصل إلى 6x ، ولكن يتباطأ ما يصل إلى 20 ٪ عندما لا تكون القيمة غير موجودة.
على سبيل المثال:
echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -v Tim -O name.first
يخبر -O JJ أن name.first .
ستجعل علامة -p الإخراج JSON جميلًا.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p name
{
"first": "Tom",
"last": "Smith"
}
كما أن Keypath اختياري عند تحديد علامة -p ، مما يسمح بتصنيع مستند JSON بالكامل.
$ echo '{"name":{"first":"Tom","last":"Smith"}}' | jj -p
{
"name": {
"first": "Tom",
"last": "Smith"
}
}
سوف يقوم علم -u بضغط JSON إلى أقل عدد ممكن من الشخصيات من خلال سحق الخطوط الجديدة والمساحات.
مقارنة سريعة من JJ إلى JQ. ملف اختبار JSON هو ملف 180 ميغابايت من 206،560 طرود المدينة في سان فرانسيسكو.
تم اختباره على جهاز MacBook Pro 2015 Running JQ 1.5 و JJ 1.0.0
JQ:
$ time cat citylots.json | jq -cM .features[10000].properties.LOT_NUM
" 091 "
real 0m5.486s
user 0m4.870s
sys 0m0.686sJJ:
$ time cat citylots.json | jj -r features.10000.properties.LOT_NUM
" 091 "
real 0m0.354s
user 0m0.161s
sys 0m0.321sJQ:
$ time cat citylots.json | jq -cM ' .features[10000].properties.LOT_NUM="12A" ' > /dev/null
real 0m13.579s
user 0m16.484s
sys 0m1.310sJJ:
$ time cat citylots.json | jj -O -v 12A features.10000.properties.LOT_NUM > /dev/null
real 0m0.431s
user 0m0.201s
sys 0m0.295sجوش بيكر tidwall
رمز المصدر JJ متاح ضمن ترخيص معهد ماساتشوستس للتكنولوجيا.