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?
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?
Respuestas:
O puede instalar jq
cuál es más rápido (escrito en C) desde su administrador de paquetes (por ejemplo, sudo apt install jq
en Ubuntu / Debian, sudo dnf install jq
en Fedora / RHEL / CentOS) o desde la fuente y luego en vim, escriba:
:%!jq .
:%!jq
Funciona igual de bien para mí.
.
para mí. Me pregunto porque.
Este one-liner funciona bien para formatear JSON en Vim en una forma legible para humanos:
:%!python -m json.tool
:%!jq .
respuesta en estos días, ya que hago menos con Python y suelo jq
instalarme 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 jq
mi solución ahora es mi preferida.
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()
jq
mencionado en las respuestas de SebMa tiene una --sort-keys
opción que haría el trabajo. Pero también es genial escribir tu propia implementación :)
Si PHP está disponible, agregue la herramienta jf
como 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>
Yo uso este :Jsonf
comando. 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)))"'