<p>httpie alterando a ordem dos campos json na saída</p>

Criado em 14 jan. 2016  ·  27Comentários  ·  Fonte: httpie/httpie

Quer saber como posso forçar o httpie a não alterar a ordem dos campos json?

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

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

com httpie

http get :8080/v1/notes/569766aed4c661fba8d85a12 

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

Eu prefiro que o campo id seja sempre o primeiro. Alguma ideia?

Comentários muito úteis

Acabei de perder muito mais tempo do que me sinto confortável em admitir tentando rastrear um problema na minha biblioteca JSON do lado do servidor porque não consegui descobrir por que estava enviando os dados na ordem errada. Nem me ocorreu que o cliente poderia estar reordenando coisas.

Vale a pena ter a opção de reordenar o JSON? 90% do tempo vai ofuscar em vez de melhorar a saída do servidor.

Eu enviaria um pull request, mas seria apenas mudar um "True" para um "False" em um arquivo.

Todos 27 comentários

Observe que no formatador json, sort_keys=True
Pode-se supor que esta seria a razão

ah ok, obrigado.

Com o seguinte eu poderia desabilitar a classificação das chaves (infelizmente junto com o recuo, mas isso não é um problema tão grande)

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

De nada, embora eu ache que isso levanta a questão de saber se a classificação é algo que deve ser feito em geral ou deve ser como o servidor pretendido

seria possível introduzir outro valor para --pretty para permitir cores e formatação mas sem ordenar as chaves na resposta?

você poderia fazer desordenado como padrão? e uma opção como --sort-keys para pessoas que desejam o comportamento das chaves de classificação; veja https://bugs.python.org/issue21650 o json.tool já tem uma opção em 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

Acabei de perder muito mais tempo do que me sinto confortável em admitir tentando rastrear um problema na minha biblioteca JSON do lado do servidor porque não consegui descobrir por que estava enviando os dados na ordem errada. Nem me ocorreu que o cliente poderia estar reordenando coisas.

Vale a pena ter a opção de reordenar o JSON? 90% do tempo vai ofuscar em vez de melhorar a saída do servidor.

Eu enviaria um pull request, mas seria apenas mudar um "True" para um "False" em um arquivo.

concordo plenamente com @carlfish

@jkbrzt alguma opinião sobre isso?

Testado isso localmente, e parece que se você disser ao formatador para não alfabetizar, você obtém chaves de objeto em uma ordem arbitrária - eu acho que é apoiado por um dicionário não ordenado? Nesse caso, a alfabetização é provavelmente melhor do que aleatória.

Eu acho que é apoiado por um dicionário não ordenado?

sim, o python json.loads por padrão carregado em um dict, que é uma ordem imprevisível (um código hash usado internamente), que não é melhor que a ordem alfabética;

mas existe uma solução alternativa, por favor use object_pairs_hook=OrderedDict ; e solte sort_keys ao ligar 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
}
>>> 

Dois iaques raspados depois: Pull request -> https://github.com/jkbrzt/httpie/pull/520

Por que vale a pena, sou um usuário que gosta de ver as chaves na minha saída JSON classificadas. Meu servidor não define uma ordem na qual ele gera as chaves e, se eu estiver procurando para ver se a chave que espero foi incluída no corpo JSON ou não, é muito mais fácil quando elas são classificadas. Então eu diria para não apenas remover arbitrariamente a funcionalidade de classificação, mas sim torná-la configurável ou alternável via sinalizador.

ping autor @jakubroztocil isso está fora de manutenção?

Existe alguma tração sobre esta questão? Como @carlfish , acabei de passar um tempo embaraçosamente longo tentando corrigir um bug no meu servidor, apenas para descobrir que o httpie era o problema.

Parece muito pouco intuitivo que ele reordene/classifique dados do servidor, sem que o usuário o habilite explicitamente.

Existe uma solução na PR #520, que infelizmente ainda não foi mesclada.

Isso seria realmente útil. A classificação não é tão boa quando você não quer.

todo o Python2 obsoleto; algum mantenedor pode dar uma olhada nos PRs pendentes? dos gráficos do contribuidor parece que @jakubroztocil @msabramo ainda está ativo?

Alguém está trabalhando nisso? Podemos esperar que isso seja resolvido?

@opensas não sabe disso, mas a solução possível é usar a ferramenta jq :

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

@opensas este recurso será incluído na próxima v2.2.0.


solução possível é usar a ferramenta jq :

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

@nmtitov aqui não é realmente jq que restaura a ordem, é o ato de redirecionar a saída que desativa as cores e a formatação (definindo efetivamente --pretty=none ).

muito obrigado pela dica, já tinha notado isso neste tópico.
Existe alguma maneira de manter o restante das informações da solicitação (status e cabeçalhos) depois de canalizar através do jq?

Quero dizer, httpie retorna isso:

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"
    }
]

mas http | jq -C remove a primeira parte, retornando apenas:

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

@opensas Eu não acho que seja possível, a menos que você escreva seu wrapper bash personalizado

@opensas @nmtitov canalizar a saída tem o efeito colateral de alterar o padrão --print=hb (imprimir cabeçalhos e corpo) para --print=b (imprimir apenas o corpo porque é isso que você normalmente deseja ao redirecionar a saída ). Você pode pedir explicitamente que os cabeçalhos sejam incluídos com --print=hb .

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

@jakubroztocil isso não funcionará porque jq espera o corpo JSON como entrada

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

Eu vejo. Você poderia usar http --download httpbin.org/get | jq

Eu encontrei o seguinte workqround, em vez de usar httpie eu encontrei curlie , que parece

Como curl, mas diferente de httpie, os cabeçalhos são escritos em stderr em vez de stdout.

Então posso usar assim:

$ 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"
  }
]

Onde como com httpie eu faria os cabeçalhos

BTW, eu criei este script conveniente:

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

Acaba de ser lançada a v2.2.0 que trata desse problema. Saiba mais sobre os novos --unsorted , --sorted e --format-options aqui:

https://httpie.org/docs#colors -and-formatting

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

Govinda-Fichtner picture Govinda-Fichtner  ·  6Comentários

a-x- picture a-x-  ·  7Comentários

ghost picture ghost  ·  5Comentários

filipesperandio picture filipesperandio  ·  3Comentários

chuma picture chuma  ·  3Comentários