ما هي أدوات CLI الجيدة لـ JSON؟




xslt command-line (4)

مشكلة عامة

على الرغم من أنني قد أقوم بتشخيص السبب الأساسي لحدث ما ، أو تحديد عدد المستخدمين الذين تأثروا به ، أو تقطير سجلات التوقيت من أجل تقييم الأداء والتأثير الناتج عن تغيير الرمز الأخير ، فإن أدواتي تبقى كما هي: grep ، awk ، sed ، tr ، uniq ، sort ، zcat ، tail ، head ، join ، and split . ولإلصاقهم جميعًا ، يمنحنا Unix الأنابيب ، ومن أجل ترشيح الحيوانات الأكثر xargs لدينا xargs . إذا فشلت هذه ، هناك دائما perl -e .

هذه الأدوات مثالية لمعالجة ملفات CSV ، وملفات محددة بعلامات جدولة ، وملفات سجلات بتنسيق خط يمكن التنبؤ به ، أو ملفات ذات أزواج قيمة-قيّمة مفصولة بفواصل. بمعنى آخر ، الملفات التي يوجد لكل سطر فيها بدون أي سياق.

نظائر XML

كنت في الآونة الأخيرة بحاجة إلى الجر من خلال غيغابايت من XML لبناء رسم بياني للاستخدام من قبل المستخدم. كان هذا سهلاً بما فيه الكفاية بالأدوات التي لديّ ، لكن بالنسبة إلى الاستعلامات الأكثر تعقيدًا ، تتعطل الطرق العادية. قل لدي ملفات تحتوي على عناصر مثل هذه:

<foo user="me">
    <baz key="zoidberg" value="squid" />
    <baz key="leela"    value="cyclops" />
    <baz key="fry"      value="rube" />
</foo>

ودعنا نقول إنني أريد إنتاج رسم خرائط من المستخدم إلى متوسط ​​عدد <baz> s لكل <foo> . لم يعد التعامل مع سطر تلو الآخر خيارًا: أحتاج إلى معرفة المستخدم <foo> أقوم بفحصه حاليًا حتى أعرف متوسط ​​تحديثه. من المرجح أن يكون أي نوع من بطانة يونكس واحدة تحقق هذه المهمة غامضاً.

لحسن الحظ في XML-land ، لدينا تقنيات رائعة مثل XPath و XQuery و XSLT لمساعدتنا.

في السابق ، كنت قد اعتدت على استخدام وحدة XML::XPath Perl الرائعة لإنجاز استعلامات مثل الموجودة أعلاه ، ولكن بعد العثور على TextMate Plugin التي يمكنها تشغيل تعبير XPath مقابل النافذة الحالية ، توقفت عن كتابة نصوص Perl لمرة واحدة. استعلام XML. ولقد اكتشفت للتو حول XMLStarlet الذي يتم تثبيته عند كتابة هذا الأمر وأتطلع إلى استخدامه في المستقبل.

JSON حلول؟

هذا يقودني إلى سؤالي: هل هناك أدوات كهذه لـ JSON؟ إنها مسألة وقت فقط قبل أن تتطلب مني بعض مهمة الاستقصاء إجراء استعلامات مشابهة على ملفات JSON ، وبدون أدوات مثل XPath و XSLT ، ستكون هذه المهمة أكثر صعوبة. لو كان لدي مجموعة من JSON تبدو كالتالي:

{
  "firstName": "Bender",
  "lastName": "Robot",
  "age": 200,
  "address": {
    "streetAddress": "123",
    "city": "New York",
    "state": "NY",
    "postalCode": "1729"
  },
  "phoneNumber": [
    { "type": "home", "number": "666 555-1234" },
    { "type": "fax", "number": "666 555-4567" }
  ]
}

وأردت العثور على متوسط ​​عدد أرقام الهاتف لكل شخص ، ويمكنني فعل شيء من هذا القبيل مع XPath:

fn:avg(/fn:count(phoneNumber))

الأسئلة

  1. هل هناك أي أدوات سطر أوامر يمكنها "الاستعلام" عن ملفات JSON بهذه الطريقة؟
  2. إذا كان عليك معالجة مجموعة من ملفات JSON على سطر أوامر Unix ، فما هي الأدوات التي تستخدمها؟
  3. هيك ، هل هناك عمل يجري القيام به لجعل لغة الاستعلام مثل هذه لـ JSON؟
  4. إذا كنت تستخدم أدوات كهذه في عملك اليومي ، فما الذي يعجبك / لا يعجبك بشأنها؟ هل هناك أي مسكينة؟

ألاحظ المزيد والمزيد من تسلسل البيانات باستخدام JSON ، لذا فإن أدوات المعالجة مثل هذه ستكون حاسمة عند تحليل مقالب البيانات الكبيرة في المستقبل. تعتبر مكتبات اللغات لـ JSON قوية للغاية ، ومن السهل كتابة البرامج النصية للقيام بهذا النوع من المعالجة ، ولكن في الحقيقة ، يجب السماح للأشخاص الذين يمارسون اللعب باستخدام أدوات shell البيانات.

أسئلة ذات صلة


ألق نظرة على f:json-document() من مكتبة FXSL 2.x.

باستخدام هذه الوظيفة ، من السهل للغاية دمج JSon واستخدامه تمامًا مثل ... XML.

على سبيل المثال ، يمكن للمرء كتابة تعبير XPath التالي:

f:json-document($vstrParam)/Students/*[sex = 'Female']

والحصول على جميع Students sex = 'Female'

هذا مثال كامل:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:f="http://fxsl.sf.net/"
 exclude-result-prefixes="f xs"
 >
 <xsl:import href="../f/func-json-document.xsl"/>

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vstrParam" as="xs:string">
{

  "teacher":{
    "name":
      "Mr Borat",
    "age":
      "35",
    "Nationality":
      "Kazakhstan"
             },


  "Class":{
    "Semester":
      "Summer",
    "Room":
      null,
    "Subject":
      "Politics",
    "Notes":
      "We're happy, you happy?"
           },

  "Students":
    {
      "Smith":
        {"First Name":"Mary","sex":"Female"},
      "Brown":
        {"First Name":"John","sex":"Male"},
      "Jackson":
        {"First Name":"Jackie","sex":"Female"}
    }
    ,


  "Grades":

    {
      "Test":
      [
        {"grade":"A","points":68,"grade":"B","points":25,"grade":"C","points":15},

        {"grade":"C","points":2, "grade":"B","points":29, "grade":"A","points":55},

        {"grade":"C","points":2, "grade":"A","points":72, "grade":"A","points":65}
       ]
    }


}
 </xsl:variable>

 <xsl:template match="/">
    <xsl:sequence select=
     "f:json-document($vstrParam)/Students/*[sex = 'Female']"/>

 </xsl:template>
</xsl:stylesheet>

عندما يتم تطبيق التحويل أعلاه على أي وثيقة XML (يتم تجاهلها) ، يتم إنتاج النتيجة الصحيحة :

<Smith>
   <First_Name>Mary</First_Name>
   <sex>Female</sex>
</Smith>
<Jackson>
   <First_Name>Jackie</First_Name>
   <sex>Female</sex>
</Jackson>

أنا فقط وجدت هذا:

http://stedolan.github.com/jq/

"jq هو معالج JSON لسطر الأوامر خفيف الوزن ومرن."

تحديث 2014:

@ user456584 مذكور:

هناك أيضًا أمر "json" (على سبيل المثال "jsontool"). أنا أميل إلى تفضيله على jq. يونيكس جدا. إليك رابط للمشروع: github.com/trentm/json -

في json README في http://github.com/trentm/json هناك قائمة طويلة من الأشياء المشابهة


إلقاء نظرة على هذا jsawk المشروع المجنون. هو تصميم لتصفية من خلال إدخال JSON من سطر الأوامر. تحقق من resty كذلك لعميل REST line line الذي يمكنك استخدامه في خطوط الأنابيب التي قد تأتي في متناول اليدين.


اكتشفت مؤخرًا أن JSON يمكن بسهولة استيعابه باستخدام Python:

$ python -c "json=eval(open('/json.txt').read()); print len(json['phoneNumber'])"
2

على الرغم من أن الطريقة ستفشل بوضوح إذا احتوى إدخال JSON على قيمة خالية.





xpath