FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[Original HTTPS Page]
cpython/Lib/json/tool.py at main · python/cpython · GitHub
python
cpython
Repository navigation
Code
Issues
5k+
(5k+)
Pull requests
2.7k
(2.7k)
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
cpython
/
Lib
/
json
/
tool.py
Copy path
More file actions
More file actions
Latest commit
History
History
History
123 lines (109 loc) · 4.57 KB
Breadcrumbs
cpython
/
Lib
/
json
/
tool.py
Copy path
File metadata and controls
123 lines (109 loc) · 4.57 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""Command-line tool to validate and pretty-print JSON
See `json.__main__` for a usage example (invocation as
`python -m json.tool` is supported for backwards compatibility).
"""
import
argparse
import
json
import
re
import
sys
from
_colorize
import
get_theme
,
can_colorize
# The string we are colorizing is valid JSON,
# so we can use a looser but simpler regex to match
# the various parts, most notably strings and numbers,
# where the regex given by the spec is much more complex.
_color_pattern
=
re
.
compile
(
r'''
(?P<key>"(\\.|[^"\\])*")(?=:) |
(?P<string>"(\\.|[^"\\])*") |
(?P<number>NaN|-?Infinity|[0-9\-+.Ee]+) |
(?P<boolean>true|false) |
(?P<null>null)
'''
,
re
.
VERBOSE
)
_group_to_theme_color
=
frozendict
({
"key"
:
"definition"
,
"string"
:
"string"
,
"number"
:
"number"
,
"boolean"
:
"keyword"
,
"null"
:
"keyword"
,
})
def
_colorize_json
(
json_str
,
theme
):
def
_replace_match_callback
(
match
):
for
group
,
color
in
_group_to_theme_color
.
items
():
if
m
:=
match
.
group
(
group
):
return
f"
{
theme
[
color
]
}
{
m
}
{
theme
.
reset
}
"
return
match
.
group
()
return
re
.
sub
(
_color_pattern
,
_replace_match_callback
,
json_str
)
def
main
():
description
=
(
'A simple command line interface for json module '
'to validate and pretty-print JSON objects.'
)
parser
=
argparse
.
ArgumentParser
(
description
=
description
)
parser
.
add_argument
(
'infile'
,
nargs
=
'?'
,
help
=
'a JSON file to be validated or pretty-printed; '
'defaults to `stdin`'
,
default
=
'-'
)
parser
.
add_argument
(
'outfile'
,
nargs
=
'?'
,
help
=
'write the output of `infile` to `outfile`'
,
default
=
None
)
parser
.
add_argument
(
'--sort-keys'
,
action
=
'store_true'
,
default
=
False
,
help
=
'sort the output of dictionaries alphabetically by key'
)
parser
.
add_argument
(
'--no-ensure-ascii'
,
dest
=
'ensure_ascii'
,
action
=
'store_false'
,
help
=
'disable escaping of non-ASCII characters'
)
parser
.
add_argument
(
'--json-lines'
,
action
=
'store_true'
,
default
=
False
,
help
=
'parse input using the JSON Lines format. '
'Use with `--no-indent` or `--compact` to produce valid JSON Lines output.'
)
group
=
parser
.
add_mutually_exclusive_group
()
group
.
add_argument
(
'--indent'
,
default
=
4
,
type
=
int
,
help
=
'separate items with newlines and use this number '
'of spaces for indentation'
)
group
.
add_argument
(
'--tab'
,
action
=
'store_const'
,
dest
=
'indent'
,
const
=
'
\t
'
,
help
=
'separate items with newlines and use '
'tabs for indentation'
)
group
.
add_argument
(
'--no-indent'
,
action
=
'store_const'
,
dest
=
'indent'
,
const
=
None
,
help
=
'separate items with spaces rather than newlines'
)
group
.
add_argument
(
'--compact'
,
action
=
'store_true'
,
help
=
'suppress all whitespace separation (most compact)'
)
options
=
parser
.
parse_args
()
dump_args
=
{
'sort_keys'
:
options
.
sort_keys
,
'indent'
:
options
.
indent
,
'ensure_ascii'
:
options
.
ensure_ascii
,
}
if
options
.
compact
:
dump_args
[
'indent'
]
=
None
dump_args
[
'separators'
]
=
','
,
':'
try
:
if
options
.
infile
==
'-'
:
infile
=
sys
.
stdin
else
:
infile
=
open
(
options
.
infile
,
encoding
=
'utf-8'
)
try
:
if
options
.
json_lines
:
lines
=
infile
.
readlines
()
objs
=
(
json
.
loads
(
line
)
for
line
in
lines
)
else
:
objs
=
(
json
.
load
(
infile
),)
finally
:
if
infile
is
not
sys
.
stdin
:
infile
.
close
()
if
options
.
outfile
is
None
:
outfile
=
sys
.
stdout
else
:
outfile
=
open
(
options
.
outfile
,
'w'
,
encoding
=
'utf-8'
)
with
outfile
:
if
can_colorize
(
file
=
outfile
):
t
=
get_theme
(
tty_file
=
outfile
).
syntax
for
obj
in
objs
:
json_str
=
json
.
dumps
(
obj
,
**
dump_args
)
outfile
.
write
(
_colorize_json
(
json_str
,
t
))
outfile
.
write
(
'
\n
'
)
else
:
for
obj
in
objs
:
json
.
dump
(
obj
,
outfile
,
**
dump_args
)
outfile
.
write
(
'
\n
'
)
except
ValueError
as
e
:
raise
SystemExit
(
e
)
if
__name__
==
'__main__'
:
try
:
main
()
except
BrokenPipeError
as
exc
:
raise
SystemExit
(
exc
.
errno
)
Back
|
FazBrowse Home
|
New Git URL