<p>httpie cambiando el orden de los campos json en la salida</p>

Creado en 14 ene. 2016  ·  27Comentarios  ·  Fuente: httpie/httpie

¿Se pregunta cómo puedo obligar a httpie a no cambiar el orden de los campos json?

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

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

con httpie

http get :8080/v1/notes/569766aed4c661fba8d85a12 

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

Prefiero que el campo id sea ​​siempre el primero. ¿Alguna idea?

Comentario más útil

Perdí mucho más tiempo del que me siento cómodo admitiendo tratando de localizar un problema en mi biblioteca JSON del lado del servidor porque no pude averiguar por qué estaba enviando los datos en el orden incorrecto. Ni siquiera se me ocurrió que el cliente podría estar reordenando cosas.

¿Vale la pena tener la opción de reordenar JSON? El 90% de las veces ofuscará en lugar de mejorar la salida del servidor.

Enviaría una solicitud de extracción, pero solo cambiaría un "Verdadero" a un "Falso" en un archivo.

Todos 27 comentarios

Tenga en cuenta que en el formateador json, sort_keys=True
Se puede suponer que esta sería la razón

ah vale, gracias.

Con lo siguiente, podría deshabilitar la clasificación de las claves (desafortunadamente junto con la sangría, pero eso no es un gran problema)

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

De nada, aunque creo que esto plantea la cuestión de si la clasificación es algo que debería hacerse en general o debería ser como el servidor pretendía.

¿sería posible introducir otro valor para --pretty para permitir colores y formato pero sin ordenar las claves en la respuesta?

¿podría hacer desordenado por defecto? y una opción como --sort-keys para las personas que desean el comportamiento de las claves de ordenación; consulte https://bugs.python.org/issue21650 json.tool ya tiene una opción en 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

Perdí mucho más tiempo del que me siento cómodo admitiendo tratando de localizar un problema en mi biblioteca JSON del lado del servidor porque no pude averiguar por qué estaba enviando los datos en el orden incorrecto. Ni siquiera se me ocurrió que el cliente podría estar reordenando cosas.

¿Vale la pena tener la opción de reordenar JSON? El 90% de las veces ofuscará en lugar de mejorar la salida del servidor.

Enviaría una solicitud de extracción, pero solo cambiaría un "Verdadero" a un "Falso" en un archivo.

totalmente de acuerdo con @carlfish

@jkbrzt ¿ alguna idea sobre esto?

Probé esto localmente, y parece que si le dices al formateador que no ordene alfabéticamente, en su lugar obtienes claves de objeto en un orden arbitrario. ¿Supongo que está respaldado por un diccionario desordenado? En ese caso, la alfabetización es probablemente mejor que la aleatoria.

¿Supongo que está respaldado por un diccionario desordenado?

sí, el python json.loads por defecto se carga en un dict, que es un orden impredecible (código hash algo usado internamente), que no es mejor que el orden alfabético;

pero hay una solución alternativa, use object_pairs_hook=OrderedDict ; y suelta sort_keys al llamar a 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
}
>>> 

Dos yaks afeitados más tarde: solicitud de extracción -> https://github.com/jkbrzt/httpie/pull/520

Por lo que vale, soy un usuario al que le gusta ver ordenadas las claves en mi salida JSON. Mi servidor no define un orden en el que genera las claves, y si busco ver si la clave que espero estaba incluida en el cuerpo JSON o no, es mucho más fácil cuando están ordenadas. Por lo tanto, diría que no solo elimine arbitrariamente la funcionalidad de clasificación, sino que la haga configurable o alternable a través de la bandera.

ping autor @jakubroztocil ¿Esto está fuera de mantenimiento?

¿Hay alguna tracción en este tema? Al igual que @carlfish , acabo de pasar una cantidad de tiempo vergonzosamente larga tratando de corregir un error en mi servidor, solo para descubrir que httpie era el problema.

Parece muy poco intuitivo que reordene/ordene los datos del servidor, sin que el usuario lo habilite explícitamente.

Hay una solución en PR #520, que lamentablemente aún no ha sido fusionado.

Esto sería realmente útil. Ordenar no es tan bueno cuando no lo quieres.

todo Python2 en desuso; algun mantenedor puede echar un vistazo a los PRs pendientes? de los gráficos de colaboradores, parece que @jakubroztocil @msabramo sigue activo?

¿Alguien está trabajando en esto? ¿Podemos esperar que esto se resuelva?

@opensas no sabe nada de eso, pero la posible solución es usar la herramienta jq :

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

@openses esta función se incluirá en la próxima v2.2.0.


la posible solución es usar la herramienta jq :

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

@nmtitov aquí en realidad no es jq lo que restaura el orden, es el acto de redirigir la salida que desactiva los colores y el formato (configurando efectivamente --pretty=none ).

Muchas gracias por el consejo, ya lo había notado en este hilo.
¿Hay alguna forma en que pueda conservar el resto de la información de la solicitud (estado y encabezados) después de canalizar a través de jq?

Quiero decir, httpie devuelve esto:

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

pero http | jq -C quita la primera parte, devolviendo solo:

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

@opensas No creo que sea posible a menos que escriba su contenedor bash personalizado

@opensas @nmtitov canalizar la salida tiene el efecto secundario de cambiar el --print=hb predeterminado (imprimir encabezados y cuerpo) a --print=b (imprimir solo el cuerpo porque eso es lo que normalmente desea al redirigir la salida ). Puede solicitar explícitamente que los encabezados se incluyan con --print=hb .

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

@jakubroztocil esto no funcionará porque jq espera el cuerpo JSON como entrada

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

Veo. Podrías usar http --download httpbin.org/get | jq

Encontré la siguiente ronda de trabajo, en lugar de usar httpie, encontré curlie , que parece

Al igual que curl pero a diferencia de httpie, los encabezados se escriben en stderr en lugar de stdout.

Entonces puedo usarlo así:

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

Donde como con httpie yo haría los encabezados

Por cierto, creé este conveniente script:

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

Recién lanzado v2.2.0 que aborda este problema. Obtén más información sobre los nuevos --unsorted , --sorted y --format-options aquí:

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

¿Fue útil esta página
0 / 5 - 0 calificaciones