<p>httpie меняет порядок полей json на выходе</p>

Созданный на 14 янв. 2016  ·  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 по умолчанию загружается в диктофон, порядок которого непредсказуем (несколько внутренний хэш-код), который не лучше, чем алфавитный порядок;

но есть обходной путь, используйте 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
}
>>> 

Два бритых яка позже: Pull request -> https://github.com/jkbrzt/httpie/pull/520

Как бы то ни было, я являюсь пользователем, которому нравится видеть отсортированные ключи в моем выводе JSON. Мой сервер не определяет порядок, в котором он выводит ключи, и если я хочу узнать, был ли ключ, который я ожидаю, включен в тело JSON или нет, это намного проще, когда они отсортированы. Поэтому я бы посоветовал не просто произвольно удалять функцию сортировки, а сделать ее настраиваемой или переключаемой с помощью флага.

ping автор @jakubroztocil это не техническое обслуживание?

Есть ли подвижки в этом вопросе? Как и @carlfish , я только что потратил невероятно много времени, пытаясь исправить ошибку на моем сервере, только чтобы обнаружить, что проблема была в httpie.

Кажется очень неинтуитивным, что он будет переупорядочивать/сортировать данные с сервера без явного включения пользователем.

В PR #520 есть решение, которое, к сожалению, еще не слили.

Это было бы очень полезно. Сортировка не так хороша, когда вы этого не хотите.

весь Python2 устарел; какой-нибудь сопровождающий может взглянуть на ожидающие PR? судя по графикам участников, @jakubroztocil @msabramo все еще активен?

Кто-нибудь работает над этим? Можем ли мы ожидать, что это будет решено?

@opensas не знает об этом, но возможное решение - использовать инструмент jq :

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

@opens , так как эта функция будет включена в грядущую версию 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

@opensas @nmtitov передача вывода имеет побочный эффект изменения значения по умолчанию --print=hb (печать заголовков и тела) на --print=b (печатать только тело, потому что это то, что вы обычно хотите при перенаправлении вывода ). Вы можете явно запросить включение заголовков с помощью --print=hb .

https://httpie.org/docs#output -параметры

@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 рейтинги