mirror of
https://github.com/python/cpython.git
synced 2025-09-08 18:01:44 +00:00
bpo-33684: json.tool: Use utf-8 for infile and outfile. (GH-17460)
This commit is contained in:
parent
24f5cac725
commit
808769f3a4
3 changed files with 24 additions and 5 deletions
|
@ -20,10 +20,12 @@ def main():
|
||||||
description = ('A simple command line interface for json module '
|
description = ('A simple command line interface for json module '
|
||||||
'to validate and pretty-print JSON objects.')
|
'to validate and pretty-print JSON objects.')
|
||||||
parser = argparse.ArgumentParser(prog=prog, description=description)
|
parser = argparse.ArgumentParser(prog=prog, description=description)
|
||||||
parser.add_argument('infile', nargs='?', type=argparse.FileType(),
|
parser.add_argument('infile', nargs='?',
|
||||||
|
type=argparse.FileType(encoding="utf-8"),
|
||||||
help='a JSON file to be validated or pretty-printed',
|
help='a JSON file to be validated or pretty-printed',
|
||||||
default=sys.stdin)
|
default=sys.stdin)
|
||||||
parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
|
parser.add_argument('outfile', nargs='?',
|
||||||
|
type=argparse.FileType('w', encoding="utf-8"),
|
||||||
help='write the output of infile to outfile',
|
help='write the output of infile to outfile',
|
||||||
default=sys.stdout)
|
default=sys.stdout)
|
||||||
parser.add_argument('--sort-keys', action='store_true', default=False,
|
parser.add_argument('--sort-keys', action='store_true', default=False,
|
||||||
|
|
|
@ -89,11 +89,11 @@ class TestTool(unittest.TestCase):
|
||||||
self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
|
self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
|
||||||
self.assertEqual(err, b'')
|
self.assertEqual(err, b'')
|
||||||
|
|
||||||
def _create_infile(self):
|
def _create_infile(self, data=None):
|
||||||
infile = support.TESTFN
|
infile = support.TESTFN
|
||||||
with open(infile, "w") as fp:
|
with open(infile, "w", encoding="utf-8") as fp:
|
||||||
self.addCleanup(os.remove, infile)
|
self.addCleanup(os.remove, infile)
|
||||||
fp.write(self.data)
|
fp.write(data or self.data)
|
||||||
return infile
|
return infile
|
||||||
|
|
||||||
def test_infile_stdout(self):
|
def test_infile_stdout(self):
|
||||||
|
@ -103,6 +103,21 @@ class TestTool(unittest.TestCase):
|
||||||
self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
|
self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
|
||||||
self.assertEqual(err, b'')
|
self.assertEqual(err, b'')
|
||||||
|
|
||||||
|
def test_non_ascii_infile(self):
|
||||||
|
data = '{"msg": "\u3053\u3093\u306b\u3061\u306f"}'
|
||||||
|
expect = textwrap.dedent('''\
|
||||||
|
{
|
||||||
|
"msg": "\\u3053\\u3093\\u306b\\u3061\\u306f"
|
||||||
|
}
|
||||||
|
''').encode()
|
||||||
|
|
||||||
|
infile = self._create_infile(data)
|
||||||
|
rc, out, err = assert_python_ok('-m', 'json.tool', infile)
|
||||||
|
|
||||||
|
self.assertEqual(rc, 0)
|
||||||
|
self.assertEqual(out.splitlines(), expect.splitlines())
|
||||||
|
self.assertEqual(err, b'')
|
||||||
|
|
||||||
def test_infile_outfile(self):
|
def test_infile_outfile(self):
|
||||||
infile = self._create_infile()
|
infile = self._create_infile()
|
||||||
outfile = support.TESTFN + '.out'
|
outfile = support.TESTFN + '.out'
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix ``json.tool`` failed to read a JSON file with non-ASCII characters when
|
||||||
|
locale encoding is not UTF-8.
|
Loading…
Add table
Add a link
Reference in a new issue