LINUX.ORG.RU

Чем причесать json в оффлайне?

 ,


1

3

Имеется файл json в одну строку. Требуется его красиво отформатировать: с переводами строк и отступами. Как это проще сделать?

Пробовал изобретать регулярные выражения для sed. Пробовал разные параметры indent. Всё немного не то, а перебирать все варианты очень долго. Никто готового решения не знает?

Заранее спасибо.

Итог: jq удобнее всего, и по его использованию много примеров, но иногда падает на ровном месте.

★★★★★

Последнее исправление: question4 (всего исправлений: 1)

Jetbrains IDEA так умеет, меню Code->Reformat Code. Для консольных применений, конечно, не подходит, но самое оно для графоюзера.

anonymous
()
Ответ на: комментарий от anonymous

Уже. На sed pretty json первая десятка предлагает ставить питон, или онлайн-формы, или jq, который занимается другим.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Тебе же отформатировать надо не что бы было, а чтобы глазами смотреть?

С этим здесь лафа: открыл файл, жмякнул Ctrl+Shift+L, готово. Всяко проще, чем в консоли шаманить, вспоминать, что за скрипт, как зовут, какие ключи требует.

Заодно и провалидируется, и ошибки подсветятся, прямо на лету, и поиск и редактирование получишь по удобной схеме.

anonymous
()
Ответ на: комментарий от anonymous

Тебе же отформатировать надо не что бы было, а чтобы глазами смотреть?

Нет. Мне надо чтобы нажал на иконку, и готов файл. Читают этот файл через cat, less, mc или winword — не моё дело.

question4 ★★★★★
() автор топика
Ответ на: комментарий от ArcFi

which json_reformat

Хорошая мысль, спасибо.

yajl

Пробую.

question4 ★★★★★
() автор топика
cat some.json | python -m json.tool
beastie ★★★★★
()

prettyjson.go:

package main

import (
	"bytes"
	"encoding/json"
	"log"
	"os"
)

func main() {
	var in, out bytes.Buffer
	_, err := in.ReadFrom(os.Stdin)
	if err != nil {
		log.Fatal(err)
	}
	err = json.Indent(&out, in.Bytes(), "", "  ")
	if err != nil {
		log.Fatal(err)
	}
	os.Stdout.Write(out.Bytes())
}
anonymous
()
Ответ на: комментарий от anonymous

Или даже не os.Stdout.Write(out.Bytes()), а out.WriteTo(os.Stdout).

anonymous
()
Ответ на: комментарий от anonymous

Перефразируя анекдот, «пока хвост не обрезал, слакварью был», если админ не путает.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4
echo '{"a": "b", "c": "d"}' | php -r 'echo json_encode(json_decode(file_get_contents("php://stdin")), JSON_PRETTY_PRINT);'
{
    "a": "b",
    "c": "d"
}

Для файла тоже самое, только php://stdin надо заменить на путь к файлу.

Kilte ★★★★★
()

оффффффф, а чего там форматить такого сложного?
в виме макрос запиши для переноса и сделай автоформат как по сишечке

q11q11 ★★★★★
()
Ответ на: комментарий от NeverLoved

Даже в вечно тухлом Debian уже 5.6 есть. Не думаю, что оно много где используется. Тем более, что срок поддержки давно истёк, как и для 5.4.

Kilte ★★★★★
()
Ответ на: комментарий от Kilte

Мало ли. Даже тут временами всплывает «как завести древний $ЯП в $distroname, потому что легаси, и всем лень доделывать».

NeverLoved ★★★★★
()

Python'ом делается в пару строк.

FIL ★★★★
()
Ответ на: комментарий от question4

Вот этот алгоритм переноса с автоформатом и интересует. Слабо написать его на sed-е? 8)

но зачем?
ведь есть макросы + команда "=" в VIM :)

q11q11 ★★★★★
()
Ответ на: комментарий от PolarFox

Экспериментально установил, что это как-то связано с путём к преобразуемому файлу относительно текущей директории. В текущей и через stdin пока всё работает.

question4 ★★★★★
() автор топика
Ответ на: комментарий от Deleted

Ну да. Глюки только в определённой директории, которую не могу назвать во избежание деанонимизации. Ну кто бы мог подумать, что название моего работодателя способно рушить программы? :)

question4 ★★★★★
() автор топика

Можно с помощью однострочника на perl:

echo '{"timestamp":"27-11-2015 18:42:43.468"}' | perl -MJSON -CIO -e 'print to_json(decode_json(join "",<STDIN>)

Правда модуль JSON не идет в стандартной поставке (однако установлен по умолчанию на большинстве дистрибутивов)

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от llorephie

Где в консоли ты предлагаешь жать Ctrl+Shift+B?

question4 ★★★★★
() автор топика
Ответ на: комментарий от q11q11

Вот этот алгоритм переноса с автоформатом и интересует. Слабо написать его на sed-е? 8)

но зачем?
ведь есть макросы + команда «=» в VIM :)

Как вызывать = в VIM из командной строки, при обработке ~200 файлов? Как должен выглядеть макрос для мешанины из массивов JSON разной степени вложенности?

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

Как должен выглядеть макрос для мешанины из массивов JSON разной степени вложенности?

ну да вот сейчас на коленке и придумаю... разбираться надо

q11q11 ★★★★★
()
Ответ на: комментарий от q11q11

Ото ж. После недели разбираний пошёл спрашивать совета на ЛОР. А тут ты предлагаешь по новому кругу долбаться.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

ааа, ну тогда сорри, хотя блин, у тебя там какие-то секретные данные? ты мог бы выложить чтоб я попробовал макрос навалять?

q11q11 ★★★★★
()
Последнее исправление: q11q11 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.