<p>httpie mengubah urutan bidang json di output</p>

Dibuat pada 14 Jan 2016  ·  27Komentar  ·  Sumber: httpie/httpie

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?

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.

Semua 27 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

jclem picture jclem  ·  6Komentar

k0pernikus picture k0pernikus  ·  3Komentar

loretoparisi picture loretoparisi  ·  6Komentar

pyvotal-cguers picture pyvotal-cguers  ·  5Komentar

eliangcs picture eliangcs  ·  5Komentar