<p>httpie changeant l'ordre des champs json dans la sortie</p>

Créé le 14 janv. 2016  ·  27Commentaires  ·  Source: httpie/httpie

Vous vous demandez comment forcer httpie à ne pas modifier l'ordre des champs json ?

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

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

avec httpie

http get :8080/v1/notes/569766aed4c661fba8d85a12 

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

Je préfère que le champ id soit toujours le premier. Des pensées?

Commentaire le plus utile

J'ai simplement perdu beaucoup plus de temps que je ne suis à l'aise pour admettre que j'essayais de détecter un problème dans ma bibliothèque JSON côté serveur, car je ne pouvais pas comprendre pourquoi elle envoyait les données dans le mauvais ordre. Il ne m'est même pas venu à l'esprit que le client pourrait réorganiser des choses.

Cela vaut-il même la peine d'avoir la possibilité de réorganiser JSON ? 90 % du temps, cela va obscurcir plutôt que d'améliorer la sortie du serveur.

Je soumettrais une demande d'extraction, mais cela changerait simplement un "True" en un "False" dans un fichier.

Tous les 27 commentaires

Notez que dans le formateur json, sort_keys=True
On peut supposer que ce serait la raison

ah d'accord, merci.

Avec ce qui suit, je pourrais désactiver le tri des clés (malheureusement avec l'indentation, mais ce n'est pas un si gros problème)

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

De rien, bien que j'estime que cela soulève la question de savoir si le tri est quelque chose qui devrait être fait en général ou devrait-il être comme prévu par le serveur

serait-il possible d'introduire une autre valeur pour --pretty afin d'autoriser les couleurs et le formatage mais sans trier les clés dans la réponse ?

pourriez-vous faire non ordonné par défaut? et une option comme --sort-keys pour les personnes qui veulent le comportement des clés de tri ; voir https://bugs.python.org/issue21650 le json.tool a déjà une option dans 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

J'ai simplement perdu beaucoup plus de temps que je ne suis à l'aise pour admettre que j'essayais de détecter un problème dans ma bibliothèque JSON côté serveur, car je ne pouvais pas comprendre pourquoi elle envoyait les données dans le mauvais ordre. Il ne m'est même pas venu à l'esprit que le client pourrait réorganiser des choses.

Cela vaut-il même la peine d'avoir la possibilité de réorganiser JSON ? 90 % du temps, cela va obscurcir plutôt que d'améliorer la sortie du serveur.

Je soumettrais une demande d'extraction, mais cela changerait simplement un "True" en un "False" dans un fichier.

entièrement d'accord avec @carlfish

@jkbrzt des idées à ce sujet?

Testé cela localement, et il semble que si vous dites au formateur de ne pas alphabétiser, vous obtenez à la place des clés d'objet dans un ordre arbitraire - je suppose qu'il est soutenu par un dictionnaire non ordonné? Dans ce cas, l'alphabétisation est probablement meilleure que le hasard.

Je suppose qu'il est soutenu par un dictionnaire non ordonné?

oui, le python json.loads chargé par défaut dans un dict, qui est un ordre imprévisible (code de hachage quelque peu utilisé en interne), qui n'est pas meilleur que l'ordre alphabétique ;

mais il existe une solution de contournement, veuillez utiliser object_pairs_hook=OrderedDict ; et déposez sort_keys lorsque vous appelez 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
}
>>> 

Deux yaks rasés plus tard : pull request -> https://github.com/jkbrzt/httpie/pull/520

Pour ce que ça vaut, il se trouve que je suis un utilisateur qui aime voir les clés de ma sortie JSON triées. Mon serveur ne définit pas d'ordre dans lequel il sort les clés, et si je cherche à voir si la clé que j'attends a été incluse dans le corps JSON ou non, c'est beaucoup plus facile quand elles sont triées. Je dirais donc de ne pas simplement supprimer arbitrairement la fonctionnalité de tri, mais plutôt de la rendre configurable ou basculable via un indicateur.

auteur ping @jakubroztocil est-ce hors maintenance ?

Y a-t-il une traction sur cette question? Comme @carlfish , je viens de passer un temps embarrassant à essayer de corriger un bogue sur mon serveur, pour découvrir que httpie était le problème.

Il semble très peu intuitif que cela réorganise/trie les données du serveur, sans que l'utilisateur ne l'active explicitement.

Il existe une solution dans le PR #520, qui n'a malheureusement pas encore été fusionné.

Ce serait vraiment utile. Le tri n'est pas si bon quand vous ne le voulez pas.

l'ensemble de Python2 est obsolète ; un mainteneur peut jeter un coup d'œil aux PR en attente ? d'après les graphiques des contributeurs, il semble que @jakubroztocil @msabramo soit toujours actif ?

Est-ce que quelqu'un travaille là-dessus ? Pouvons-nous nous attendre à ce que cela soit résolu?

@opensas ne le sait pas, mais la solution possible consiste à utiliser l'outil jq :

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

@opensas cette fonctionnalité sera incluse dans la prochaine v2.2.0.


la solution possible est d'utiliser l'outil jq :

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

@nmtitov ici, ce n'est pas réellement jq qui restaure l'ordre, c'est l'acte de rediriger la sortie qui désactive les couleurs et le formatage (réglant effectivement --pretty=none ).

merci beaucoup pour le conseil, déjà remarqué dans ce fil.
Existe-t-il un moyen de conserver le reste des informations de la demande (état et en-têtes) après avoir transité par jq ?

Je veux dire, httpie renvoie ceci:

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

mais http | jq -C supprime la première partie, ne retournant que :

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

@opensas Je ne pense pas que ce soit possible à moins que vous écriviez votre wrapper bash personnalisé

@opensas @nmtitov canaliser la sortie a pour effet secondaire de changer la valeur par défaut --print=hb (en-têtes et corps d'impression) en --print=b (imprimer uniquement le corps car c'est ce que vous voulez généralement lorsque vous redirigez la sortie ). Vous pouvez explicitement demander que les en-têtes soient inclus avec --print=hb .

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

@jakubroztocil cela ne fonctionnera pas car jq attend le corps JSON comme entrée

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

Je vois. Vous pourriez utiliser http --download httpbin.org/get | jq

J'ai trouvé le workqround suivant, au lieu d'utiliser httpie j'ai trouvé curlie , qui semble

Comme curl mais contrairement à httpie, les en-têtes sont écrits sur stderr au lieu de stdout.

Je peux donc l'utiliser comme ceci :

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

Où, comme avec httpie, je voudrais les en-têtes

BTW, j'ai créé ce script pratique :

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

Vient de sortir la v2.2.0 qui résout ce problème. Découvrez les nouveaux --unsorted , --sorted et --format-options ici :

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

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Abdallah-Obaid picture Abdallah-Obaid  ·  4Commentaires

ghost picture ghost  ·  5Commentaires

hrj picture hrj  ·  5Commentaires

pyvotal-cguers picture pyvotal-cguers  ·  5Commentaires

chuma picture chuma  ·  3Commentaires