<p>httpie تغيير ترتيب حقول json في الإخراج</p>

تم إنشاؤها على ١٤ يناير ٢٠١٦  ·  27تعليقات  ·  مصدر: httpie/httpie

أتساءل كيف يمكنني إجبار httpie على عدم تغيير ترتيب حقول json؟

curl -i http://localhost:8080/v1/notes/569766aed4c661fba8d85a12

{
  "id": "569766aed4c661fba8d85a12",
  "content": "hi"
}

مع httpie

http get :8080/v1/notes/569766aed4c661fba8d85a12 

{
  "content": "hi",
  "id": "569766aed4c661fba8d85a12"
}

أفضل أن يكون الحقل id هو الأول دائمًا. أي أفكار؟

التعليق الأكثر فائدة

لقد ضيعت وقتًا أكثر مما أشعر بالراحة عند الاعتراف بمحاولة تعقب مشكلة في مكتبة JSON الخاصة بي من جانب الخادم لأنني لم أستطع معرفة سبب إرسال البيانات بترتيب خاطئ. لم يخطر ببالي حتى أن العميل قد يعيد ترتيب الأشياء.

هل من المفيد أن يكون لديك خيار إعادة ترتيب JSON؟ 90٪ من الوقت يتم تشويش إخراج الخادم بدلاً من تحسينه.

كنت سأرسل طلب سحب ، لكنه سيكون مجرد تغيير "صواب" إلى "خطأ" في ملف واحد.

ال 27 كومينتر

لاحظ أنه في منسق json ، sort_keys = True
يمكن للمرء أن يفترض أن هذا سيكون السبب

آه حسنًا ، شكرًا.

باستخدام ما يلي ، يمكنني تعطيل فرز المفاتيح (للأسف مع المسافة البادئة ، لكن هذه ليست مشكلة كبيرة)

http --pretty=colors get :8080/v1/notes/569766aed4c661fba8d85a12

مرحبًا بك ، على الرغم من أنني أشعر أن هذا يثير مسألة ما إذا كان الفرز أمرًا يجب القيام به بشكل عام أو يجب أن يكون على النحو المقصود من الخادم

هل من الممكن تقديم قيمة أخرى لـ --pretty أودر للسماح بالألوان والتنسيق ولكن بدون فرز المفاتيح في الاستجابة؟

هل يمكنك جعلها غير مرتبة بشكل افتراضي؟ وخيار مثل --sort-keys للأشخاص الذين يريدون سلوك مفاتيح الفرز ؛ راجع https://bugs.python.org/issue21650 يحتوي json.tool على خيار في python3 بالفعل

➸ python3 -m json.tool -h
usage: python -m json.tool [-h] [--sort-keys] [infile] [outfile]

A simple command line interface for json module to validate and pretty-print
JSON objects.

positional arguments:
  infile       a JSON file to be validated or pretty-printed
  outfile      write the output of infile to outfile

optional arguments:
  -h, --help   show this help message and exit
  --sort-keys  sort the output of dictionaries alphabetically by key

لقد ضيعت وقتًا أكثر مما أشعر بالراحة عند الاعتراف بمحاولة تعقب مشكلة في مكتبة JSON الخاصة بي من جانب الخادم لأنني لم أستطع معرفة سبب إرسال البيانات بترتيب خاطئ. لم يخطر ببالي حتى أن العميل قد يعيد ترتيب الأشياء.

هل من المفيد أن يكون لديك خيار إعادة ترتيب JSON؟ 90٪ من الوقت يتم تشويش إخراج الخادم بدلاً من تحسينه.

كنت سأرسل طلب سحب ، لكنه سيكون مجرد تغيير "صواب" إلى "خطأ" في ملف واحد.

أتفق تمامًا مع @ carlfish

jkbrzt أي أفكار حول هذا؟

تم اختبار ذلك محليًا ، ويبدو أنه إذا أخبرت المنسق بعدم الترتيب الأبجدي ، فستحصل على مفاتيح الكائنات بترتيب عشوائي بدلاً من ذلك - أعتقد أنها مدعومة بقاموس غير مرتب؟ في هذه الحالة ، ربما يكون الترتيب الأبجدي أفضل من الترتيب العشوائي.

أعتقد أنه مدعوم بقاموس غير مرتب؟

نعم ، يتم تحميل python json.loads افتراضيًا في dict ، وهو ترتيب لا يمكن التنبؤ به (رمز التجزئة المستخدم داخليًا إلى حد ما) ، وهذا ليس أفضل من الترتيب الأبجدي ؛

ولكن هناك حل بديل ، الرجاء استخدام object_pairs_hook=OrderedDict ؛ وإسقاط sort_keys عند الاتصال بـ json.dumps

>>> import json
>>> from collections import OrderedDict
>>> data = json.loads('{"foo":1, "bar": 2}', object_pairs_hook=OrderedDict)
>>> print json.dumps(data, indent=4)
{
    "foo": 1,
    "bar": 2
}
>>> 

حلقان ثيران في وقت لاحق: طلب السحب -> https://github.com/jkbrzt/httpie/pull/520

لما يستحق ، أنا مستخدم يحب رؤية المفاتيح في إخراج JSON الخاص بي مرتبة. لا يعرّف الخادم الخاص بي ترتيبًا يُخرج فيه المفاتيح ، وإذا كنت أتطلع لمعرفة ما إذا كان المفتاح الذي أتوقعه مدرجًا في هيكل JSON أم لا ، فسيكون ذلك أسهل كثيرًا عند فرزها. لذلك أقول ليس فقط إزالة وظيفة الفرز بشكل تعسفي ، ولكن بدلاً من ذلك جعلها قابلة للتكوين أو التبديل عبر العلم.

مؤلف pingjakubroztocil هل هذا خارج الصيانة؟

هل هناك أي جاذبية لهذه القضية؟ مثل carlfish ، لقد قضيت للتو وقتًا طويلاً محرجًا في محاولة تصحيح خطأ في الخادم الخاص بي ، فقط لأجد أن httpie هو المشكلة.

يبدو من غير المنطقي جدًا أنه سيعيد ترتيب / فرز البيانات من الخادم ، دون تمكين المستخدم صراحةً.

يوجد حل في PR # 520 ، والذي للأسف لم يتم دمجه بعد.

هذا سيكون مفيدا حقا الفرز ليس جيدًا عندما لا تريده.

تم إهمال Python2 بالكامل ؛ يمكن لبعض المشرفين إلقاء نظرة على العلاقات العامة المعلقة؟ من الرسوم البيانية للمساهمين يبدو أنjakubroztocilmsabramo لا يزال نشطًا؟

هل هناك من يعمل على هذا؟ هل يمكننا توقع حل هذا؟

لا يعرف opensas عن ذلك ولكن الحل المحتمل هو استخدام أداة jq :

http https://jsonplaceholder.typicode.com/todos/1 | jq -C

opensas سيتم تضمين هذه الميزة في الإصدار 2.2.0 القادم.


الحل الممكن هو استخدام أداة jq :

http https://jsonplaceholder.typicode.com/todos/1 | jq -C

nmtitov هنا ليس jq هو الذي يعيد الترتيب ، إنه عملية إعادة توجيه الإخراج الذي يوقف الألوان والتنسيق (الإعداد الفعال --pretty=none ).

شكرا جزيلا للنصيحة ، لاحظت ذلك بالفعل في هذا الموضوع.
هل هناك طريقة ما يمكنني من خلالها الاحتفاظ ببقية معلومات الطلب (الحالة والرؤوس) بعد تمريرها من خلال jq؟

أعني ، تقوم httpie بإرجاع هذا:

HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 109
Content-Type: application/json; charset=utf-8
Date: Sat, 25 Apr 2020 11:14:32 GMT
ETag: W/"6d-wWZh31xOzPgYyzU23ihgZaW8KkI"
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block

[
    {
        "id": 1,
        "text": "Read the docs"
    },
    {
        "id": 2,
        "text": "Create my first application"
    },
    {
        "id": 3,
        "text": "Write tests"
    }
]

لكن http | jq -C شرائط الجزء الأول ، وتعود فقط:

[
  {
    "id": 1,
    "text": "Read the docs"
  },
  {
    "id": 2,
    "text": "Create my first application"
  },
  {
    "id": 3,
    "text": "Write tests"
  }
]

opensas لا أعتقد أنه ممكن ما لم تكتب غلاف bash المخصص الخاص بك

opensasnmtitov piping يكون للإخراج تأثير جانبي لتغيير القيمة الافتراضية --print=hb (رؤوس الطباعة والجسم) إلى --print=b (اطبع النص فقط لأن هذا ما تريده عادةً عند إعادة توجيه الإخراج ). يمكنك أن تطلب صراحةً تضمين الرؤوس في --print=hb .

https://httpie.org/docs#output -options

jakubroztocil لن يعمل هذا لأن jq يتوقع جسم JSON كمدخل

$ http --print=hb https://jsonplaceholder.typicode.com/todos/1 | jq -C
parse error: Invalid numeric literal at line 1, column 9

أرى. يمكنك استخدام http --download httpbin.org/get | jq

لقد وجدت ملف العمل التالي ، بدلاً من استخدام httpie ، وجدت curlie ، والذي يبدو أنه

مثل curl ولكن على عكس httpie ، تتم كتابة الرؤوس على stderr بدلاً من stdout.

لذلك يمكنني استخدامه على النحو التالي:

$ curlie GET localhost:3000/tasks | jq -C
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 304
ETag: W/"130-ED1W4hQo1i7na7wy5Ewc7iKdoJc"
Date: Wed, 27 May 2020 06:28:26 GMT
Connection: keep-alive

[
  {
    "id": 2,
    "title": "new task2",
    "description": "description2",
    "status": "OPEN"
  },
  {
    "id": 3,
    "title": "new task3",
    "description": "description3",
    "status": "OPEN"
  }
]

حيث كما هو الحال مع httpie ، أود استخدام الرؤوس

راجع للشغل ، لقد أنشأت هذا البرنامج النصي المريح:

$ cat ~/bin/c
curlie "$@" | jq -C

أصدر للتو الإصدار 2.2.0 الذي يعالج هذه المشكلة. تعرف على المزيد حول --unsorted و --sorted و --format-options هنا:

https://httpie.org/docs#colors -و-التنسيق

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

chuma picture chuma  ·  3تعليقات

Abdallah-Obaid picture Abdallah-Obaid  ·  4تعليقات

rshurts picture rshurts  ·  5تعليقات

hrj picture hrj  ·  5تعليقات

sensibleish picture sensibleish  ·  3تعليقات