Issue #17225: JSON decoder now counts columns in the first line starting
with 1, as in other lines.
diff --git a/Doc/library/json.rst b/Doc/library/json.rst
index 25a3358..500435c 100644
--- a/Doc/library/json.rst
+++ b/Doc/library/json.rst
@@ -101,7 +101,7 @@
         "json": "obj"
     }
     $ echo '{1.2:3.4}' | python -mjson.tool
-    Expecting property name enclosed in double quotes: line 1 column 1 (char 1)
+    Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
 
 .. highlight:: python3
 
diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py
index 3b23224..3f95cc3 100644
--- a/Lib/json/__init__.py
+++ b/Lib/json/__init__.py
@@ -96,7 +96,7 @@
         "json": "obj"
     }
     $ echo '{ 1.2:3.4}' | python -m json.tool
-    Expecting property name enclosed in double quotes: line 1 column 2 (char 2)
+    Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
 """
 __version__ = '2.0.9'
 __all__ = [
diff --git a/Lib/json/decoder.py b/Lib/json/decoder.py
index 7e5a099..1b6c10b 100644
--- a/Lib/json/decoder.py
+++ b/Lib/json/decoder.py
@@ -24,7 +24,7 @@
         newline = '\n'
     lineno = doc.count(newline, 0, pos) + 1
     if lineno == 1:
-        colno = pos
+        colno = pos + 1
     else:
         colno = pos - doc.rindex(newline, 0, pos)
     return lineno, colno
diff --git a/Lib/json/tool.py b/Lib/json/tool.py
index 9ab6d65..7db4528 100644
--- a/Lib/json/tool.py
+++ b/Lib/json/tool.py
@@ -7,7 +7,7 @@
         "json": "obj"
     }
     $ echo '{ 1.2:3.4}' | python -m json.tool
-    Expecting property name enclosed in double quotes: line 1 column 2 (char 2)
+    Expecting property name enclosed in double quotes: line 1 column 3 (char 2)
 
 """
 import sys
diff --git a/Lib/test/json_tests/test_fail.py b/Lib/test/json_tests/test_fail.py
index a2dc29a..5b652e8 100644
--- a/Lib/test/json_tests/test_fail.py
+++ b/Lib/test/json_tests/test_fail.py
@@ -125,8 +125,8 @@
         ]
         for data, msg, idx in test_cases:
             self.assertRaisesRegex(ValueError,
-                r'^{0}: line 1 column {1} \(char {1}\)'.format(
-                    re.escape(msg), idx),
+                r'^{0}: line 1 column {1} \(char {2}\)'.format(
+                    re.escape(msg), idx + 1, idx),
                 self.loads, data)
 
     def test_unexpected_data(self):
@@ -155,8 +155,8 @@
         ]
         for data, msg, idx in test_cases:
             self.assertRaisesRegex(ValueError,
-                r'^{0}: line 1 column {1} \(char {1}\)'.format(
-                    re.escape(msg), idx),
+                r'^{0}: line 1 column {1} \(char {2}\)'.format(
+                    re.escape(msg), idx + 1, idx),
                 self.loads, data)
 
     def test_extra_data(self):
@@ -173,10 +173,22 @@
         for data, msg, idx in test_cases:
             self.assertRaisesRegex(ValueError,
                 r'^{0}: line 1 column {1} - line 1 column {2}'
-                r' \(char {1} - {2}\)'.format(
-                    re.escape(msg), idx, len(data)),
+                r' \(char {3} - {4}\)'.format(
+                    re.escape(msg), idx + 1, len(data) + 1, idx, len(data)),
                 self.loads, data)
 
+    def test_linecol(self):
+        test_cases = [
+            ('!', 1, 1, 0),
+            (' !', 1, 2, 1),
+            ('\n!', 2, 1, 1),
+            ('\n  \n\n     !', 4, 6, 10),
+        ]
+        for data, line, col, idx in test_cases:
+            self.assertRaisesRegex(ValueError,
+                r'^Expecting value: line {0} column {1}'
+                r' \(char {2}\)$'.format(line, col, idx),
+                self.loads, data)
 
 class TestPyFail(TestFail, PyTest): pass
 class TestCFail(TestFail, CTest): pass
diff --git a/Misc/NEWS b/Misc/NEWS
index 8d935c6..541b1f7 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -260,6 +260,9 @@
 Library
 -------
 
+- Issue #17225: JSON decoder now counts columns in the first line starting
+  with 1, as in other lines.
+
 - Issue #6623: Added explicit DeprecationWarning for ftplib.netrc, which has
   been deprecated and undocumented for a long time.