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 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 .
:%!jqFunciona 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 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.
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()
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 :)
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>
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)))"'