通过消除空格来压缩JSON文件

时间:2014-08-12 00:01:23

标签: json whitespace

我正在使用大型json文件(~100,000行),需要将其压缩以使程序运行得更快。我希望删除所有水平制表符,返回等,以最小化文件的大小。

例如,如果最初是一行:

"name_id": "Richard Feynman",
"occupation": "Professional Bongos Player"

应压缩为:

"name_id":"Richard Feynman","occupation":"Professional Bongos Player"`

我已经浏览了互联网(请原谅我,如果这是一个简单的答案,我是初学者)并且似乎无法找到终端的命令,这将帮助我做到这一点。任何帮助将不胜感激

3 个答案:

答案 0 :(得分:11)

看起来你正在寻找一个JSON minifier

周围有一些onlinestandalone

尝试使用Google搜索这些字词+您喜欢的语言,我相信您会找到适合您需求的内容。

other tools修改你的JSON以使它更小,但我猜你最终会得到一个不同的JSON。没试过那些。

答案 1 :(得分:1)

使用GNU awk进行RT:

$ awk 'BEGIN{RS="\""} NR%2{gsub(/[[:space:]]/,"")} {ORS=RT;print} END{printf "\n"}' file
"name_id":"Richard Feynman","occupation":"Professional Bongos Player"

答案 2 :(得分:0)

以下flex(1)程序将完成工作。它构成了json源的词法分析,并消除了令牌之间的注释和空格,尊重了字符串空间。它还识别不带引号的标识符,并引用它们。

要编译它,只需执行

make json

使用以下命令:

json [ file ... ]

如果您未指定文件,该程序将从stdin读取。

这是来源:

%{
/* json-min.  JSON minimizer.
 * Author: Luis Colorado <lc@luiscoloradosistemas.com>
 * Date: Wed Aug 13 07:35:23 EEST 2014
 * Disclaimer: This program is GPL, as of GPL version 3, you
 * may have received a copy of that document, or you can
 * instead look at http://www.gnu.org/licenses/gpl.txt to read
 * it.  There's no warranty, nor assumed nor implicit on the
 * use of this program, you receive it `as is' so whatever you
 * do with it is only your responsibility.  Luis Colorado
 * won't assume any responsibility of the use or misuse of
 * this program.  You are warned.
 */
%}

dec ([1-9][0-9]*)
oct (0[0-7]*)
hex (0[xX][0-9a-fA-F]*)
doub    ({dec}"."([0-9]*)?|{dec}?"."[0-9]+)
strd    (\"([^\"]|\\.)*\")
t   "true"
f   "false"
n   "null"
com1    "//".*
com2b   "/*"
endc    "*/"
ident   ([a-zA-Z_][a-zA-Z0-9_]*)

%x INCOMMENT
%option noyywrap

%%

{dec}           |
{oct}           |
{hex}           |
{doub}          |
{strd}              |
{t}             |
{f}         |
{n}         |
"{"         |
":"         |
";"         |
"}"         |
"["         |
"]"         |
","         ECHO;

[\ \t\n]        |
{com1}          ;
{com2b}         BEGIN(INCOMMENT);
<INCOMMENT>.        ;
<INCOMMENT>{endc}   BEGIN(INITIAL);

{ident}         { fprintf(stderr, "WARNING:"
                "unquoted identifier %s "
                "in source.  Quoting.\n",
                yytext);
              printf("\"%s\"", yytext);
            }
.           { fprintf(stderr,
                "WARNING: unknown symbol %s "
                "in source, copied to output\n",
                yytext);
              ECHO;
            }

%%

void process(const char *fn);

int main(int argc, const char **argv)
{
    int i;
    if (argc > 1) for (i = 1; i < argc; i++)
        process(argv[i]);
    else process(NULL); /* <-- stdin */
} /* main */

void process(const char *fn)
{
    FILE *f = stdin;
    if (fn) {
        f = fopen(fn, "r");
        if (!f) {
            fprintf(stderr,
                "ERROR:fopen:%s:%s(errno=%d)\n",
                fn, strerror(errno), errno);
            exit(EXIT_FAILURE);
        } /* if */
    } /* if */
    yyin = f;
    yylex();
    if (fn) /* only close if we opened, don't close stdin. */
        fclose(f);
    printf("\n");
}

我刚刚写完了,所以几乎没有测试过。小心使用(保存原始文件的备份)它不会覆盖原始文件,只会输出到stdout,因此您不会使用它覆盖数据。

BR, 路易斯