title: Does it make sense to `json.loads` to accept booleans, null and numbers as a JSON string?
body: <p>I ran into this issue while challenging the <strong>Python</strong> <code>json.loads</code> method.</p>
  <p>As I understand it this method should convert a stringified JSON structure in a:</p>
  <ul>
  <li>Python <code>dict</code> while parsing a JSON structured as a map</li>
  <li>Python <code>list</code> while parsing a JSON structured as an array</li>
  </ul>
  <p>So far these behaviours are okay:</p>
  <pre class="lang-py prettyprint-override"><code>import json
  &gt;&gt;&gt; json.loads(&quot;{\&quot;hello\&quot;: \&quot;world\&quot;}&quot;)
  {'hello': 'world'}
  &gt;&gt;&gt; json.loads(&quot;[{\&quot;hello\&quot;: \&quot;world\&quot;}]&quot;)
  [{'hello': 'world'}]
  </code></pre>
  <p>And it is also okay to raise an exception when string has nothing to deal with a JSON structure:</p>
  <pre class="lang-py prettyprint-override"><code>&gt;&gt;&gt; json.loads(&quot;abc&quot;)
  ...
  json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
  </code></pre>
  <p>But then how is it consistent to convert strings that represent booleans, null and numbers?:</p>
  <pre class="lang-py prettyprint-override"><code>&gt;&gt;&gt; json.loads(&quot;true&quot;)
  True
  &gt;&gt;&gt; json.loads(&quot;false&quot;)
  False
  &gt;&gt;&gt; json.loads(&quot;null&quot;) is None
  True
  &gt;&gt;&gt; json.loads(&quot;1&quot;)
  1
  &gt;&gt;&gt; json.loads(&quot;1.0&quot;)
  1.0
  </code></pre>