Ingin tahu bagaimana saya bisa memaksa httpie untuk tidak mengubah urutan bidang json?
curl -i http://localhost:8080/v1/notes/569766aed4c661fba8d85a12
{
"id": "569766aed4c661fba8d85a12",
"content": "hi"
}
dengan httpie
http get :8080/v1/notes/569766aed4c661fba8d85a12
{
"content": "hi",
"id": "569766aed4c661fba8d85a12"
}
Saya lebih suka bidang id
untuk selalu menjadi yang pertama. Ada pikiran?
Perhatikan bahwa dalam formatter json, sort_keys=True
Seseorang dapat berasumsi bahwa ini akan menjadi alasannya
baiklah, terima kasih.
Dengan yang berikut ini saya dapat menonaktifkan penyortiran kunci (sayangnya bersama dengan lekukan, tapi itu bukan masalah besar)
http --pretty=colors get :8080/v1/notes/569766aed4c661fba8d85a12
Sama-sama, meskipun saya merasa ini menimbulkan pertanyaan apakah penyortiran adalah sesuatu yang harus dilakukan secara umum atau harus seperti yang dimaksudkan server
apakah mungkin untuk memperkenalkan nilai lain untuk --pretty
untuk memungkinkan warna dan pemformatan tetapi tanpa menyortir kunci dalam respons?
bisakah Anda membuat tidak berurutan sebagai default? dan opsi seperti --sort-keys
untuk orang yang menginginkan perilaku kunci pengurutan; lihat https://bugs.python.org/issue21650 json.tool sudah memiliki opsi di 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
Saya baru saja kehilangan lebih banyak waktu daripada yang saya rasa nyaman untuk mencoba melacak masalah di perpustakaan JSON sisi server saya karena saya tidak tahu mengapa itu mengirim data dalam urutan yang salah. Bahkan tidak terpikir oleh saya bahwa klien dapat memesan ulang barang.
Apakah layak memiliki opsi untuk menyusun ulang JSON? 90% dari waktu itu akan mengaburkan daripada meningkatkan output server.
Saya akan mengajukan permintaan tarik, tetapi itu hanya akan mengubah "Benar" menjadi "Salah" dalam satu file.
sepenuhnya setuju dengan @carlfish
@jkbrzt ada pemikiran tentang ini?
Menguji ini secara lokal, dan sepertinya jika Anda memberi tahu pemformat untuk tidak mengurutkan abjad, Anda mendapatkan kunci objek dalam urutan arbitrer - saya kira itu didukung oleh kamus yang tidak berurutan? Dalam hal ini, alfabetisasi mungkin lebih baik daripada acak.
Saya kira itu didukung oleh kamus yang tidak berurutan?
ya, python json.loads
secara default dimuat ke dalam dict, yang urutannya tidak dapat diprediksi (agak digunakan secara internal kode hash), yang tidak lebih baik dari urutan abjad;
tapi ada solusinya, silakan gunakan object_pairs_hook=OrderedDict
; dan jatuhkan sort_keys
saat memanggil 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
}
>>>
Dua yak yang dicukur nanti: Tarik permintaan -> https://github.com/jkbrzt/httpie/pull/520
Untuk apa nilainya, kebetulan saya adalah pengguna yang suka melihat kunci dalam output JSON saya diurutkan. Server saya tidak menentukan urutan yang mengeluarkan kunci, dan jika saya ingin melihat apakah kunci yang saya harapkan termasuk dalam badan JSON atau tidak, itu jauh lebih mudah ketika mereka diurutkan. Jadi saya akan mengatakan untuk tidak hanya menghapus fungsionalitas penyortiran secara sewenang-wenang, tetapi membuatnya dapat dikonfigurasi atau dialihkan melalui flag.
ping author @jakubroztocil apakah ini dari maintenance?
Apakah ada daya tarik tentang masalah ini? Seperti @carlfish , saya baru saja menghabiskan banyak waktu yang memalukan untuk mencoba memperbaiki bug di server saya, hanya untuk menemukan, bahwa httpie adalah masalahnya.
Tampaknya sangat tidak intuitif bahwa itu akan menyusun ulang/mengurutkan data dari server, tanpa pengguna secara eksplisit mengaktifkannya.
Ada solusi di PR #520, yang sayangnya belum digabung.
Ini akan sangat berguna. Penyortiran tidak begitu baik jika Anda tidak menginginkannya.
seluruh Python2 tidak digunakan lagi; beberapa pengelola dapat melihat PR yang tertunda? dari grafik kontributor sepertinya @jakubroztocil @msabramo masih aktif?
Apakah ada yang mengerjakan ini? Bisakah kita mengharapkan ini untuk diselesaikan?
@opensas tidak tahu tentang itu tetapi solusi yang mungkin adalah menggunakan alat jq
:
http https://jsonplaceholder.typicode.com/todos/1 | jq -C
@opensas fitur ini akan disertakan dalam v2.2.0 mendatang.
solusi yang mungkin adalah menggunakan alat
jq
:http https://jsonplaceholder.typicode.com/todos/1 | jq -C
@nmtitov di sini sebenarnya bukan jq
yang mengembalikan pesanan, ini adalah tindakan mengarahkan ulang output yang mematikan warna dan pemformatan (secara efektif mengatur --pretty=none
).
terima kasih banyak atas tipnya, sudah memperhatikannya di utas ini.
Apakah ada cara saya dapat menyimpan sisa info permintaan (status & tajuk) setelah pemipaan melalui jq?
Maksud saya, httpie mengembalikan ini:
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"
}
]
tapi http | jq -C menghapus bagian pertama, hanya mengembalikan:
[
{
"id": 1,
"text": "Read the docs"
},
{
"id": 2,
"text": "Create my first application"
},
{
"id": 3,
"text": "Write tests"
}
]
@opensas Saya tidak berpikir itu mungkin kecuali Anda menulis pembungkus bash khusus Anda
@opensas @nmtitov piping output memiliki efek samping mengubah default --print=hb
(print header dan body) menjadi --print=b
(cetak hanya body karena itulah yang biasanya Anda inginkan saat mengarahkan output ). Anda dapat secara eksplisit meminta header untuk disertakan dengan --print=hb
.
https://httpie.org/docs#output -options
@jakubroztocil ini tidak akan berfungsi karena jq
mengharapkan badan JSON sebagai input
$ http --print=hb https://jsonplaceholder.typicode.com/todos/1 | jq -C
parse error: Invalid numeric literal at line 1, column 9
Jadi begitu. Anda dapat menggunakan http --download httpbin.org/get | jq
Saya menemukan workqround berikut, alih-alih menggunakan httpie saya menemukan curlie , yang sepertinya
Seperti curl tetapi tidak seperti httpie, header ditulis di stderr, bukan stdout.
Jadi saya bisa menggunakannya seperti ini:
$ 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"
}
]
Sedangkan dengan httpie saya akan membuat header
BTW, saya membuat skrip yang nyaman ini:
$ cat ~/bin/c
curlie "$@" | jq -C
Baru saja merilis v2.2.0 yang membahas masalah ini. Pelajari tentang --unsorted
baru, --sorted
dan --format-options
di sini:
https://httpie.org/docs#colors -and-formatting
Komentar yang paling membantu
Saya baru saja kehilangan lebih banyak waktu daripada yang saya rasa nyaman untuk mencoba melacak masalah di perpustakaan JSON sisi server saya karena saya tidak tahu mengapa itu mengirim data dalam urutan yang salah. Bahkan tidak terpikir oleh saya bahwa klien dapat memesan ulang barang.
Apakah layak memiliki opsi untuk menyusun ulang JSON? 90% dari waktu itu akan mengaburkan daripada meningkatkan output server.
Saya akan mengajukan permintaan tarik, tetapi itu hanya akan mengubah "Benar" menjadi "Salah" dalam satu file.