Cómo formatear el archivo JSON en Vim

27

Dado un archivo con un objeto JSON grande, todo en una línea como

{"versions":[{"count":2,"version":""},{"count":1,"version":"1.1.1"},{"count":14,"version":"2.9"},{...

¿Cómo puedo formatear esto para que sea legible para humanos en Vim?

ljs.dev
fuente
1
StackOverflow Post relacionado: ¿Cómo arreglar la sangría JSON en vim?
Peter Rincker

Respuestas:

47

O puede instalar jqcuál es más rápido (escrito en C) desde su administrador de paquetes (por ejemplo, sudo apt install jqen Ubuntu / Debian, sudo dnf install jqen Fedora / RHEL / CentOS) o desde la fuente y luego en vim, escriba:

:%!jq .
SebMa
fuente
1
:%!jqFunciona igual de bien para mí.
Micks Ketches
3
Hm ... solo funciona con lo agregado .para mí. Me pregunto porque.
Costa
29

Este one-liner funciona bien para formatear JSON en Vim en una forma legible para humanos:

:%!python -m json.tool

ljs.dev
fuente
1
¿Memorizas eso y lo escribes cada vez o usas algún tipo de alias?
asedsami
Tiendo a usar la :%!jq .respuesta en estos días, ya que hago menos con Python y suelo jqinstalarme en mis sistemas para cualquier trabajo JSON en la CLI. También recibo notificaciones para esta pregunta SO con bastante frecuencia, por lo que me ayuda a no olvidar: PI prefiere vim con una personalización mínima, sin complementos, etc., que es otra razón por la cual jqmi solución ahora es mi preferida.
ljs.dev
(respuesta aceptada actualizada para reflejar esto)
ljs.dev
3
Solo una advertencia de que esto escapará a algunos caracteres solo en ASCII. Entonces, si desea la codificación UTF8, jq es la mejor opción.
AndrewHarvey
5

Para formatear de manera determinista, necesitamos ordenar el hash. Ninguna de las otras respuestas hizo eso por mí, así que creé la mía:

function! FormatJson()
python << EOF
import vim
import json
try:
    buf = vim.current.buffer
    json_content = '\n'.join(buf[:])
    content = json.loads(json_content)
    sorted_content = json.dumps(content, indent=4, sort_keys=True)
    buf[:] = sorted_content.split('\n')
except Exception, e:
    print e
EOF
endfunction

Uso:

:call FormatJson()
Prajit Patil
fuente
¡Bienvenidos a Vi y Vim ! Buena primera respuesta; ¡Es interesante que consideres el aspecto de clasificación!
D. Ben Knoble
Sobre la clasificación, estoy bastante seguro de que lo jqmencionado en las respuestas de SebMa tiene una --sort-keysopción que haría el trabajo. Pero también es genial escribir tu propia implementación :)
statox
1

Si PHP está disponible, agregue la herramienta jfcomo formateador JSON de Composer:

$ composer global require codegear/json-formatter

Luego formatee el archivo actual:

:%!jf %

O agregue un mapa de teclas en vimrc:

nnoremap <Leader>jf :%!jf %<CR>
Lei Fan
fuente
1

Yo uso este :Jsonfcomando. Puede formatear unicode.

command! Jsonf :execute '%!python -c "import json,sys,collections,re; sys.stdout.write(re.sub(r\"\\\u[0-9a-f]{4}\", lambda m:m.group().decode(\"unicode_escape\").encode(\"utf-8\"),json.dumps(json.load(sys.stdin, object_pairs_hook=collections.OrderedDict), indent=2)))"'
han xi
fuente