Хотите знать, как я могу заставить 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 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
здесь:
Самый полезный комментарий
Я только что потерял гораздо больше времени, чем мне удобно признать, пытаясь отследить проблему в моей серверной библиотеке JSON, потому что я не мог понять, почему она отправляет данные в неправильном порядке. Мне даже в голову не пришло, что клиент может что-то переупорядочить.
Стоит ли вообще иметь возможность изменить порядок JSON? В 90% случаев это будет запутывать, а не улучшать вывод сервера.
Я бы отправил запрос на вытягивание, но это просто изменило бы «Истина» на «Ложь» в одном файле.