110 lines
70 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<div class="body" role="main"><div class="section" id="module-json"><h1><span class="yiyi-st" id="yiyi-10">19.2. <a class="reference internal" href="#module-json" title="json: Encode and decode the JSON format."><code class="xref py py-mod docutils literal"><span class="pre">json</span></code></a> - JSON编码器和解码器</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/json/__init__.py">Lib / json / __ init __.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference external" href="http://json.org">JSON (JavaScript Object Notation)</a>, specified by <span class="target" id="index-0"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc7159.html"><strong>RFC 7159</strong></a> (which obsoletes <span class="target" id="index-1"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc4627.html"><strong>RFC 4627</strong></a>) and by <a class="reference external" href="http://www.ecma-international.org/publications/standards/Ecma-404.htm">ECMA-404</a>, is a lightweight data interchange format inspired by <a class="reference external" href="https://en.wikipedia.org/wiki/JavaScript">JavaScript</a> object literal syntax (although it is not a strict subset of JavaScript <a class="footnote-reference" href="#rfc-errata" id="id1">[1]</a> ).</span></p><p><span class="yiyi-st" id="yiyi-13"><a class="reference internal" href="#module-json" title="json: Encode and decode the JSON format."><code class="xref py py-mod docutils literal"><span class="pre">json</span></code></a>显示标准库<a class="reference internal" href="marshal.html#module-marshal" title="marshal: Convert Python objects to streams of bytes and back (with different constraints)."><code class="xref py py-mod docutils literal"><span class="pre">marshal</span></code></a><a class="reference internal" href="pickle.html#module-pickle" title="pickle: Convert Python objects to streams of bytes and back."><code class="xref py py-mod docutils literal"><span class="pre">pickle</span></code></a>模块的用户熟悉的API。</span></p><p><span class="yiyi-st" id="yiyi-14">对基本Python对象层次结构进行编码</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">json</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">([</span><span class="s1">'foo'</span><span class="p">,</span> <span class="p">{</span><span class="s1">'bar'</span><span class="p">:</span> <span class="p">(</span><span class="s1">'baz'</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mi">2</span><span class="p">)}])</span>
<span class="go">'["foo", {"bar": ["baz", null, 1.0, 2]}]'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="s2">"</span><span class="se">\"</span><span class="s2">foo</span><span class="se">\b</span><span class="s2">ar"</span><span class="p">))</span>
<span class="go">"\"foo\bar"</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="s1">'</span><span class="se">\u1234</span><span class="s1">'</span><span class="p">))</span>
<span class="go">"\u1234"</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="s1">'</span><span class="se">\\</span><span class="s1">'</span><span class="p">))</span>
<span class="go">"\\"</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span><span class="s2">"c"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">"b"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s2">"a"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
<span class="go">{"a": 0, "b": 0, "c": 0}</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">io</span> <span class="k">import</span> <span class="n">StringIO</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">io</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">()</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">([</span><span class="s1">'streaming API'</span><span class="p">],</span> <span class="n">io</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">io</span><span class="o">.</span><span class="n">getvalue</span><span class="p">()</span>
<span class="go">'["streaming API"]'</span>
</code></pre><p><span class="yiyi-st" id="yiyi-15">紧凑编码:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">json</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,{</span><span class="s1">'4'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">'6'</span><span class="p">:</span> <span class="mi">7</span><span class="p">}],</span> <span class="n">separators</span><span class="o">=</span><span class="p">(</span><span class="s1">','</span><span class="p">,</span> <span class="s1">':'</span><span class="p">))</span>
<span class="go">'[1,2,3,{"4":5,"6":7}]'</span>
</code></pre><p><span class="yiyi-st" id="yiyi-16">漂亮的输出:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">json</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">({</span><span class="s1">'4'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">'6'</span><span class="p">:</span> <span class="mi">7</span><span class="p">},</span> <span class="n">sort_keys</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">4</span><span class="p">))</span>
<span class="go">{</span>
<span class="go"> "4": 5,</span>
<span class="go"> "6": 7</span>
<span class="go">}</span>
</code></pre><p><span class="yiyi-st" id="yiyi-17">解码JSON</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">json</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="s1">'["foo", {"bar":["baz", null, 1.0, 2]}]'</span><span class="p">)</span>
<span class="go">['foo', {'bar': ['baz', None, 1.0, 2]}]</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="s1">'"</span><span class="se">\\</span><span class="s1">"foo</span><span class="se">\\</span><span class="s1">bar"'</span><span class="p">)</span>
<span class="go">'"foo\x08ar'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">io</span> <span class="k">import</span> <span class="n">StringIO</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">io</span> <span class="o">=</span> <span class="n">StringIO</span><span class="p">(</span><span class="s1">'["streaming API"]'</span><span class="p">)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">io</span><span class="p">)</span>
<span class="go">['streaming API']</span>
</code></pre><p><span class="yiyi-st" id="yiyi-18">专用JSON对象解码</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">json</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">def</span> <span class="nf">as_complex</span><span class="p">(</span><span class="n">dct</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">if</span> <span class="s1">'__complex__'</span> <span class="ow">in</span> <span class="n">dct</span><span class="p">:</span>
<span class="gp">... </span> <span class="k">return</span> <span class="nb">complex</span><span class="p">(</span><span class="n">dct</span><span class="p">[</span><span class="s1">'real'</span><span class="p">],</span> <span class="n">dct</span><span class="p">[</span><span class="s1">'imag'</span><span class="p">])</span>
<span class="gp">... </span> <span class="k">return</span> <span class="n">dct</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="s1">'{"__complex__": true, "real": 1, "imag": 2}'</span><span class="p">,</span>
<span class="gp">... </span> <span class="n">object_hook</span><span class="o">=</span><span class="n">as_complex</span><span class="p">)</span>
<span class="go">(1+2j)</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">decimal</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="s1">'1.1'</span><span class="p">,</span> <span class="n">parse_float</span><span class="o">=</span><span class="n">decimal</span><span class="o">.</span><span class="n">Decimal</span><span class="p">)</span>
<span class="go">Decimal('1.1')</span>
</code></pre><p><span class="yiyi-st" id="yiyi-19">扩展<a class="reference internal" href="#json.JSONEncoder" title="json.JSONEncoder"><code class="xref py py-class docutils literal"><span class="pre">JSONEncoder</span></code></a></span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span> <span class="nn">json</span>
<span class="gp">&gt;&gt;&gt; </span><span class="k">class</span> <span class="nc">ComplexEncoder</span><span class="p">(</span><span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">def</span> <span class="nf">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">complex</span><span class="p">):</span>
<span class="gp">... </span> <span class="k">return</span> <span class="p">[</span><span class="n">obj</span><span class="o">.</span><span class="n">real</span><span class="p">,</span> <span class="n">obj</span><span class="o">.</span><span class="n">imag</span><span class="p">]</span>
<span class="gp">... </span> <span class="c1"># Let the base class default method raise the TypeError</span>
<span class="gp">... </span> <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="o">.</span><span class="n">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">obj</span><span class="p">)</span>
<span class="gp">...</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="n">j</span><span class="p">,</span> <span class="n">cls</span><span class="o">=</span><span class="n">ComplexEncoder</span><span class="p">)</span>
<span class="go">'[2.0, 1.0]'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">ComplexEncoder</span><span class="p">()</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="n">j</span><span class="p">)</span>
<span class="go">'[2.0, 1.0]'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">ComplexEncoder</span><span class="p">()</span><span class="o">.</span><span class="n">iterencode</span><span class="p">(</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="n">j</span><span class="p">))</span>
<span class="go">['[2.0', ', 1.0', ']']</span>
</code></pre><p><span class="yiyi-st" id="yiyi-20">使用<a class="reference internal" href="#module-json.tool" title="json.tool: A command line to validate and pretty-print JSON."><code class="xref py py-mod docutils literal"><span class="pre">json.tool</span></code></a>从shell验证和pretty-print</span></p><div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nb">echo</span> <span class="s1">'{"json":"obj"}'</span> <span class="p">|</span> python -m json.tool
<span class="o">{</span>
<span class="s2">"json"</span>: <span class="s2">"obj"</span>
<span class="o">}</span>
$ <span class="nb">echo</span> <span class="s1">'{1.2:3.4}'</span> <span class="p">|</span> python -m json.tool
Expecting property name enclosed in double quotes: line <span class="m">1</span> column <span class="m">2</span> <span class="o">(</span>char 1<span class="o">)</span>
</pre></div></div><p><span class="yiyi-st" id="yiyi-21">有关详细文档,请参见<a class="reference internal" href="#json-commandline"><span>Command Line Interface</span></a></span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-22">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-23">JSON是<a class="reference external" href="http://yaml.org/">YAML</a> 1.2的子集。</span><span class="yiyi-st" id="yiyi-24">由此模块的默认设置(特别是默认的<em>分隔符</em>生成的JSON也是YAML 1.0和1.1的子集。</span><span class="yiyi-st" id="yiyi-25">因此该模块也可以用作YAML串行器。</span></p></div><div class="section" id="basic-usage"><h2><span class="yiyi-st" id="yiyi-26">19.2.1. </span><span class="yiyi-st" id="yiyi-27">基本用法</span></h2><dl class="function"><dt id="json.dump"><span class="yiyi-st" id="yiyi-28"> <code class="descclassname">json.</code><code class="descname">dump</code><span class="sig-paren">(</span><em>obj</em>, <em>fp</em>, <em>skipkeys=False</em>, <em>ensure_ascii=True</em>, <em>check_circular=True</em>, <em>allow_nan=True</em>, <em>cls=None</em>, <em>indent=None</em>, <em>separators=None</em>, <em>default=None</em>, <em>sort_keys=False</em>, <em>**kw</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-29"><em>obj</em>序列化为<em>fp</em>a <code class="docutils literal"><span class="pre">.write()</span></code> - 支持<a class="reference internal" href="../glossary.html#term-file-like-object"><span class="xref std std-term">file-like object</span></a>使用此<a class="reference internal" href="#py-to-json-table"><span>conversion table</span></a></span></p><p><span class="yiyi-st" id="yiyi-30">如果 <em>skipkeys</em> 的值为 true (默认为: <code class="docutils literal"><span class="pre">False</span></code>), 那么不是基本类型 (<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>, <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal"><span class="pre">int</span></code></a>, <a class="reference internal" href="functions.html#float" title="float"><code class="xref py py-class docutils literal"><span class="pre">float</span></code></a>, <a class="reference internal" href="functions.html#bool" title="bool"><code class="xref py py-class docutils literal"><span class="pre">bool</span></code></a>, <code class="docutils literal"><span class="pre">None</span></code>)的字典键将会被跳过, 而不是引发一个 <a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a> 异常.</span></p><p><span class="yiyi-st" id="yiyi-31"><a class="reference internal" href="#module-json" title="json: Encode and decode the JSON format."><code class="xref py py-mod docutils literal"><span class="pre">json</span></code></a>模块总是产生<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>对象,而不是<a class="reference internal" href="functions.html#bytes" title="bytes"><code class="xref py py-class docutils literal"><span class="pre">bytes</span></code></a>对象。</span><span class="yiyi-st" id="yiyi-32">因此,<code class="docutils literal"><span class="pre">fp.write()</span></code>必须支持<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>输入。</span></p><p><span class="yiyi-st" id="yiyi-33">如果<em>ensure_ascii</em>为true这是默认值则输出将保证所有传入的非ASCII字符都转义。</span><span class="yiyi-st" id="yiyi-34">如果<em>ensure_ascii</em>为false则这些字符将按原样输出。</span></p><p><span class="yiyi-st" id="yiyi-35">如果<em>check_circular</em>为false默认值<code class="docutils literal"><span class="pre">True</span></code>),则将跳过容器类型的循环引用检查,循环引用将导致<a class="reference internal" href="exceptions.html#OverflowError" title="OverflowError"><code class="xref py py-exc docutils literal"><span class="pre">OverflowError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-36">如果<em>allow_nan</em>为false默认值<code class="docutils literal"><span class="pre">True</span></code>),则将是<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a>序列化超出范围<a class="reference internal" href="functions.html#float" title="float"><code class="xref py py-class docutils literal"><span class="pre">float</span></code></a>值(<code class="docutils literal"><span class="pre">nan</span></code><code class="docutils literal"><span class="pre">inf</span></code><code class="docutils literal"><span class="pre">-inf</span></code>严格遵守JSON规范。</span><span class="yiyi-st" id="yiyi-37">如果<em>allow_nan</em>为true则将使用与其等效的JavaScript代码<code class="docutils literal"><span class="pre">NaN</span></code><code class="docutils literal"><span class="pre">Infinity</span></code><code class="docutils literal"><span class="pre">-Infinity</span></code>)。</span></p><p><span class="yiyi-st" id="yiyi-38">如果<em>indent</em>是非负整数或字符串那么JSON数组元素和对象成员将以该缩进级别打印。</span><span class="yiyi-st" id="yiyi-39">缩进级别0负数或<code class="docutils literal"><span class="pre">""</span></code>将只插入换行符。</span><span class="yiyi-st" id="yiyi-40"><code class="docutils literal"><span class="pre">None</span></code>(默认值)选择最紧凑的表示。</span><span class="yiyi-st" id="yiyi-41">使用正整数缩进缩进,每个级别有许多空格。</span><span class="yiyi-st" id="yiyi-42">如果<em>缩进</em>是字符串(例如<code class="docutils literal"><span class="pre">"\t"</span></code>),则该字符串用于缩进每个级别。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-43"><span class="versionmodified">在版本3.2中更改:</span>允许<em>缩进</em>的字符串以及整数。</span></p></div><p><span class="yiyi-st" id="yiyi-44">如果指定,<em>分隔符</em>应为<code class="docutils literal"><span class="pre">item_separator</span> <span class="pre">key_separator</span></code>元组。</span><span class="yiyi-st" id="yiyi-45">The default is <code class="docutils literal"><span class="pre">(',</span> <span class="pre">',</span> <span class="pre">':</span> <span class="pre">')</span></code> if <em>indent</em> is <code class="docutils literal"><span class="pre">None</span></code> and <code class="docutils literal"><span class="pre">(',',</span> <span class="pre">':</span> <span class="pre">')</span></code> otherwise. </span><span class="yiyi-st" id="yiyi-46">要获得最紧凑的JSON表示应指定<code class="docutils literal"><span class="pre">''</span> <span class="pre">''</span></code></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-47"><span class="versionmodified">在版本3.4中更改:</span>使用<code class="docutils literal"><span class="pre">''</span> <span class="pre">'</span> <span class="pre">')作为默认值,如果<em>缩进</em>不是<code class="docutils literal"><span class="pre">None</span></code></span></code></span></p></div><p><span class="yiyi-st" id="yiyi-48">如果指定,<em>默认</em>应该是一个函数,为不能被序列化的对象调用。</span><span class="yiyi-st" id="yiyi-49">它应该返回对象的JSON可编码版本或引发<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a></span><span class="yiyi-st" id="yiyi-50">如果未指定,则会引发<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-51">如果<em>sort_keys</em>为真(默认值:<code class="docutils literal"><span class="pre">False</span></code>),则字典的输出将按键排序。</span></p><p><span class="yiyi-st" id="yiyi-52">要使用自定义<a class="reference internal" href="#json.JSONEncoder" title="json.JSONEncoder"><code class="xref py py-class docutils literal"><span class="pre">JSONEncoder</span></code></a>子类(例如</span><span class="yiyi-st" id="yiyi-53">覆盖<code class="xref py py-meth docutils literal"><span class="pre">default()</span></code>方法以序列化其他类型),使用<em>cls</em> kwarg指定它否则使用<a class="reference internal" href="#json.JSONEncoder" title="json.JSONEncoder"><code class="xref py py-class docutils literal"><span class="pre">JSONEncoder</span></code></a></span></p></dd></dl><dl class="function"><dt id="json.dumps"><span class="yiyi-st" id="yiyi-54"> <code class="descclassname">json.</code><code class="descname">dumps</code><span class="sig-paren">(</span><em>obj</em>, <em>skipkeys=False</em>, <em>ensure_ascii=True</em>, <em>check_circular=True</em>, <em>allow_nan=True</em>, <em>cls=None</em>, <em>indent=None</em>, <em>separators=None</em>, <em>default=None</em>, <em>sort_keys=False</em>, <em>**kw</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-55">使用此<a class="reference internal" href="#py-to-json-table"><span>conversion table</span></a><em>obj</em>序列化为JSON格式的<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a></span><span class="yiyi-st" id="yiyi-56">参数具有与<a class="reference internal" href="#json.dump" title="json.dump"><code class="xref py py-func docutils literal"><span class="pre">dump()</span></code></a>中相同的含义。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-57">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-58">Unlike <a class="reference internal" href="pickle.html#module-pickle" title="pickle: Convert Python objects to streams of bytes and back."><code class="xref py py-mod docutils literal"><span class="pre">pickle</span></code></a> and <a class="reference internal" href="marshal.html#module-marshal" title="marshal: Convert Python objects to streams of bytes and back (with different constraints)."><code class="xref py py-mod docutils literal"><span class="pre">marshal</span></code></a>, JSON is not a framed protocol, so trying to serialize multiple objects with repeated calls to <a class="reference internal" href="#json.dump" title="json.dump"><code class="xref py py-func docutils literal"><span class="pre">dump()</span></code></a> using the same <em>fp</em> will result in an invalid JSON file.</span></p></div><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-59">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-60">JSON的键/值对中的键始终为<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>类型。</span><span class="yiyi-st" id="yiyi-61">当字典转换为JSON时字典的所有键都会强制转换为字符串。</span><span class="yiyi-st" id="yiyi-62">因此如果字典转换为JSON然后回到字典字典可能不等于原始字典。</span><span class="yiyi-st" id="yiyi-63">也就是说如果x具有非字符串键<code class="docutils literal"><span class="pre">载入dumpsx</span> <span class="pre">=</span> <span class="pre">x</span> </code></span></p></div></dd></dl><dl class="function"><dt id="json.load"><span class="yiyi-st" id="yiyi-64"> <code class="descclassname">json.</code><code class="descname">load</code><span class="sig-paren">(</span><em>fp</em>, <em>cls=None</em>, <em>object_hook=None</em>, <em>parse_float=None</em>, <em>parse_int=None</em>, <em>parse_constant=None</em>, <em>object_pairs_hook=None</em>, <em>**kw</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-65">使用 <a class="reference internal" href="#json-to-py-table"><span>这个转换表</span></a><em>fp</em> (一个包含 JSON 文档并支持 <code class="docutils literal"><span class="pre">.read()</span></code>方法的 <a class="reference internal" href="../glossary.html#term-file-like-object"><span class="xref std std-term">file-like object</span></a> ) 反序列化为一个python对象。</span></p><p><span class="yiyi-st" id="yiyi-66"><em>object_hook</em>是一个可选的函数,它将被任何对象字面值解码(<a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a>)的结果调用。</span><span class="yiyi-st" id="yiyi-67">将使用<em>object_hook</em>的返回值而不是<a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a></span><span class="yiyi-st" id="yiyi-68">这个功能可以用于实现自定义的解码器(例如,</span><span class="yiyi-st" id="yiyi-69"><a class="reference external" href="http://www.jsonrpc.org">JSON-RPC</a>类提示)。</span></p><p><span class="yiyi-st" id="yiyi-70"><em>object_pairs_hook</em>是一个可选的函数,它将使用任何对象字面值的结果进行调用,并使用对的有序列表进行解码。</span><span class="yiyi-st" id="yiyi-71">将使用<em>object_pairs_hook</em>的返回值,而不是<a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a></span><span class="yiyi-st" id="yiyi-72">该特征可以用于实现依赖于键和值对被解码的顺序的自定义解码器(例如,<a class="reference internal" href="collections.html#collections.OrderedDict" title="collections.OrderedDict"><code class="xref py py-func docutils literal"><span class="pre">collections.OrderedDict()</span></code></a>将记住插入的顺序)。</span><span class="yiyi-st" id="yiyi-73">如果还定义了<em>object_hook</em>,则<em>object_pairs_hook</em>优先。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-74"><span class="versionmodified">在版本3.1中已更改:</span>添加对<em>object_pairs_hook</em>的支持。</span></p></div><p><span class="yiyi-st" id="yiyi-75"><em>parse_float</em>如果指定将使用要解码的每个JSON浮点的字符串进行调用。</span><span class="yiyi-st" id="yiyi-76">默认情况下,这相当于<code class="docutils literal"><span class="pre">float(num_str)</span></code></span><span class="yiyi-st" id="yiyi-77">这可以用于使用另一个数据类型或解析器为JSON浮动例如。</span><span class="yiyi-st" id="yiyi-78"><a class="reference internal" href="decimal.html#decimal.Decimal" title="decimal.Decimal"><code class="xref py py-class docutils literal"><span class="pre">decimal.Decimal</span></code></a>)。</span></p><p><span class="yiyi-st" id="yiyi-79"><em>parse_int</em>如果指定将使用要解码的每个JSON int的字符串进行调用。</span><span class="yiyi-st" id="yiyi-80">默认情况下,这相当于<code class="docutils literal"><span class="pre">int(num_str)</span></code></span><span class="yiyi-st" id="yiyi-81">这可以用于使用另一个数据类型或解析器为JSON整数例如。</span><span class="yiyi-st" id="yiyi-82"><a class="reference internal" href="functions.html#float" title="float"><code class="xref py py-class docutils literal"><span class="pre">float</span></code></a>)。</span></p><p><span class="yiyi-st" id="yiyi-83"><em>parse_constant</em>如果指定,将使用以下字符串之一调用:<code class="docutils literal"><span class="pre">'-Infinity'</span></code><code class="docutils literal"><span class="pre">'Infinity'</span></code><code class="docutils literal"><span class="pre">'NaN'</span></code></span><span class="yiyi-st" id="yiyi-84">这可以用于引发异常如果遇到无效的JSON数字。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-85"><span class="versionmodified">在版本3.1中更改:</span> <em>parse_constant</em>不会在“null”“true”和“false”上调用。</span></p></div><p><span class="yiyi-st" id="yiyi-86">要使用自定义<a class="reference internal" href="#json.JSONDecoder" title="json.JSONDecoder"><code class="xref py py-class docutils literal"><span class="pre">JSONDecoder</span></code></a>子类,请使用<code class="docutils literal"><span class="pre">cls</span></code> kwarg否则使用<a class="reference internal" href="#json.JSONDecoder" title="json.JSONDecoder"><code class="xref py py-class docutils literal"><span class="pre">JSONDecoder</span></code></a></span><span class="yiyi-st" id="yiyi-87">额外的关键字参数将被传递给类的构造函数。</span></p><p><span class="yiyi-st" id="yiyi-88">如果反序列化的数据不是有效的JSON文档则会引发<a class="reference internal" href="#json.JSONDecodeError" title="json.JSONDecodeError"><code class="xref py py-exc docutils literal"><span class="pre">JSONDecodeError</span></code></a></span></p></dd></dl><dl class="function"><dt id="json.loads"><span class="yiyi-st" id="yiyi-89"> <code class="descclassname">json.</code><code class="descname">loads</code><span class="sig-paren">(</span><em>s</em>, <em>encoding=None</em>, <em>cls=None</em>, <em>object_hook=None</em>, <em>parse_float=None</em>, <em>parse_int=None</em>, <em>parse_constant=None</em>, <em>object_pairs_hook=None</em>, <em>**kw</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-90">使用此<a class="reference internal" href="#json-to-py-table"><span>conversion table</span></a>将包含JSON文档的<em>s</em>a <a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>实例解压缩为Python对象。</span></p><p><span class="yiyi-st" id="yiyi-91">其他参数与<a class="reference internal" href="#json.load" title="json.load"><code class="xref py py-func docutils literal"><span class="pre">load()</span></code></a>中含义相同,除了<em>编码</em>,它被忽略和弃用。</span></p><p><span class="yiyi-st" id="yiyi-92">如果反序列化的数据不是有效的JSON文档则会引发<a class="reference internal" href="#json.JSONDecodeError" title="json.JSONDecodeError"><code class="xref py py-exc docutils literal"><span class="pre">JSONDecodeError</span></code></a></span></p></dd></dl></div><div class="section" id="encoders-and-decoders"><h2><span class="yiyi-st" id="yiyi-93">19.2.2. </span><span class="yiyi-st" id="yiyi-94">Encoders and Decoders</span></h2><dl class="class"><dt id="json.JSONDecoder"><span class="yiyi-st" id="yiyi-95"> <em class="property">class </em><code class="descclassname">json.</code><code class="descname">JSONDecoder</code><span class="sig-paren">(</span><em>object_hook=None</em>, <em>parse_float=None</em>, <em>parse_int=None</em>, <em>parse_constant=None</em>, <em>strict=True</em>, <em>object_pairs_hook=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-96">简单的JSON解码器。</span></p><p><span class="yiyi-st" id="yiyi-97">默认情况下,在解码时执行以下翻译:</span></p><table border="1" class="docutils" id="json-to-py-table"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-98">JSON</span></th><th class="head"><span class="yiyi-st" id="yiyi-99">Python</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-100">object</span></td><td><span class="yiyi-st" id="yiyi-101">dict</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-102">数组</span></td><td><span class="yiyi-st" id="yiyi-103">列表</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-104"></span></td><td><span class="yiyi-st" id="yiyi-105">str</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-106">numberint</span></td><td><span class="yiyi-st" id="yiyi-107">int</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-108">数字(实数)</span></td><td><span class="yiyi-st" id="yiyi-109">浮动</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-110">真正</span></td><td><span class="yiyi-st" id="yiyi-111">真正</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-112"></span></td><td><span class="yiyi-st" id="yiyi-113"></span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-114">空值</span></td><td><span class="yiyi-st" id="yiyi-115">没有</span></td></tr></tbody></table><p><span class="yiyi-st" id="yiyi-116">它还将<code class="docutils literal"><span class="pre">NaN</span></code><code class="docutils literal"><span class="pre">Infinity</span></code><code class="docutils literal"><span class="pre">-Infinity</span></code>理解为它们对应的<code class="docutils literal"><span class="pre">float</span></code>值, 。</span></p><p><span class="yiyi-st" id="yiyi-117"><em>object_hook</em>如果指定将使用每个解析的JSON对象的结果进行调用其返回值将用于替换给定的<a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a></span><span class="yiyi-st" id="yiyi-118">这可以用于提供定制反序列化(例如,</span><span class="yiyi-st" id="yiyi-119">以支持JSON-RPC类提示</span></p><p><span class="yiyi-st" id="yiyi-120"><em>object_pairs_hook</em>如果指定将使用对的有序列表解码的每个JSON对象的结果进行调用。</span><span class="yiyi-st" id="yiyi-121">将使用<em>object_pairs_hook</em>的返回值,而不是<a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a></span><span class="yiyi-st" id="yiyi-122">该特征可以用于实现依赖于键和值对被解码的顺序的自定义解码器(例如,<a class="reference internal" href="collections.html#collections.OrderedDict" title="collections.OrderedDict"><code class="xref py py-func docutils literal"><span class="pre">collections.OrderedDict()</span></code></a>将记住插入的顺序)。</span><span class="yiyi-st" id="yiyi-123">如果还定义了<em>object_hook</em>,则<em>object_pairs_hook</em>优先。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-124"><span class="versionmodified">在版本3.1中已更改:</span>添加对<em>object_pairs_hook</em>的支持。</span></p></div><p><span class="yiyi-st" id="yiyi-125"><em>parse_float</em>如果指定将使用要解码的每个JSON浮点的字符串进行调用。</span><span class="yiyi-st" id="yiyi-126">默认情况下,这相当于<code class="docutils literal"><span class="pre">float(num_str)</span></code></span><span class="yiyi-st" id="yiyi-127">这可以用于使用另一个数据类型或解析器为JSON浮动例如。</span><span class="yiyi-st" id="yiyi-128"><a class="reference internal" href="decimal.html#decimal.Decimal" title="decimal.Decimal"><code class="xref py py-class docutils literal"><span class="pre">decimal.Decimal</span></code></a>)。</span></p><p><span class="yiyi-st" id="yiyi-129"><em>parse_int</em>如果指定将使用要解码的每个JSON int的字符串进行调用。</span><span class="yiyi-st" id="yiyi-130">默认情况下,这相当于<code class="docutils literal"><span class="pre">int(num_str)</span></code></span><span class="yiyi-st" id="yiyi-131">这可以用于使用另一个数据类型或解析器为JSON整数例如。</span><span class="yiyi-st" id="yiyi-132"><a class="reference internal" href="functions.html#float" title="float"><code class="xref py py-class docutils literal"><span class="pre">float</span></code></a>)。</span></p><p><span class="yiyi-st" id="yiyi-133"><em>parse_constant</em>如果指定,将使用以下字符串之一调用:<code class="docutils literal"><span class="pre">'-Infinity'</span></code><code class="docutils literal"><span class="pre">'Infinity'</span></code><code class="docutils literal"><span class="pre">'NaN'</span></code><code class="docutils literal"><span class="pre">'null'</span></code><code class="docutils literal"><span class="pre">'true'</span></code><code class="docutils literal"><span class="pre">'false'</span></code></span><span class="yiyi-st" id="yiyi-134">这可以用于引发异常如果遇到无效的JSON数字。</span></p><p><span class="yiyi-st" id="yiyi-135">如果<em>strict</em>为false<code class="docutils literal"><span class="pre">True</span></code>是默认值),则在字符串中将允许控制字符。</span><span class="yiyi-st" id="yiyi-136">在此上下文中的控制字符是具有在0-31范围内的字符代码的字符包括<code class="docutils literal"><span class="pre">'\t'</span></code>tab<code class="docutils literal"><span class="pre">'\n'</span></code><code class="docutils literal"><span class="pre">'\r'</span></code><code class="docutils literal"><span class="pre">'\0'</span></code></span></p><p><span class="yiyi-st" id="yiyi-137">如果反序列化的数据不是有效的JSON文档则会引发<a class="reference internal" href="#json.JSONDecodeError" title="json.JSONDecodeError"><code class="xref py py-exc docutils literal"><span class="pre">JSONDecodeError</span></code></a></span></p><dl class="method"><dt id="json.JSONDecoder.decode"><span class="yiyi-st" id="yiyi-138"> <code class="descname">decode</code><span class="sig-paren">(</span><em>s</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-139">返回<em>s</em>包含JSON文档的<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>实例的Python表示形式。</span></p><p><span class="yiyi-st" id="yiyi-140">如果给定的JSON文档无效则会引发<a class="reference internal" href="#json.JSONDecodeError" title="json.JSONDecodeError"><code class="xref py py-exc docutils literal"><span class="pre">JSONDecodeError</span></code></a></span></p></dd></dl><dl class="method"><dt id="json.JSONDecoder.raw_decode"><span class="yiyi-st" id="yiyi-141"> <code class="descname">raw_decode</code><span class="sig-paren">(</span><em>s</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-142"><em>s</em>以JSON文档开头的<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>解码JSON文档并返回一个2元组的Python表示形式和<em>s t4 &gt;文档结束。</em></span></p><p><span class="yiyi-st" id="yiyi-143">这可以用于从可能在末尾有无关数据的字符串解码JSON文档。</span></p></dd></dl></dd></dl><dl class="class"><dt id="json.JSONEncoder"><span class="yiyi-st" id="yiyi-144"> <em class="property">class </em><code class="descclassname">json.</code><code class="descname">JSONEncoder</code><span class="sig-paren">(</span><em>skipkeys=False</em>, <em>ensure_ascii=True</em>, <em>check_circular=True</em>, <em>allow_nan=True</em>, <em>sort_keys=False</em>, <em>indent=None</em>, <em>separators=None</em>, <em>default=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-145">用于Python数据结构的可扩展JSON编码器。</span></p><p><span class="yiyi-st" id="yiyi-146">默认情况下支持以下对象和类型:</span></p><table border="1" class="docutils" id="py-to-json-table"><thead valign="bottom"><tr class="row-odd"><th class="head"><span class="yiyi-st" id="yiyi-147">Python</span></th><th class="head"><span class="yiyi-st" id="yiyi-148">JSON</span></th></tr></thead><tbody valign="top"><tr class="row-even"><td><span class="yiyi-st" id="yiyi-149">命令</span></td><td><span class="yiyi-st" id="yiyi-150">目的</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-151">列表,元组</span></td><td><span class="yiyi-st" id="yiyi-152">数组</span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-153">str</span></td><td><span class="yiyi-st" id="yiyi-154"></span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-155">intfloatint-float-derived枚举</span></td><td><span class="yiyi-st" id="yiyi-156"></span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-157">真正</span></td><td><span class="yiyi-st" id="yiyi-158">真正</span></td></tr><tr class="row-odd"><td><span class="yiyi-st" id="yiyi-159"></span></td><td><span class="yiyi-st" id="yiyi-160"></span></td></tr><tr class="row-even"><td><span class="yiyi-st" id="yiyi-161">没有</span></td><td><span class="yiyi-st" id="yiyi-162">空值</span></td></tr></tbody></table><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-163"><span class="versionmodified">在版本3.4中更改:</span>添加了对int和float派生的Enum类的支持。</span></p></div><p><span class="yiyi-st" id="yiyi-164">要扩展它以识别其他对象,使用另一个返回<code class="docutils literal"><span class="pre">o</span></code>可序列化对象的方法,子类化并实现<a class="reference internal" href="#json.JSONEncoder.default" title="json.JSONEncoder.default"><code class="xref py py-meth docutils literal"><span class="pre">default()</span></code></a>方法否则应调用超类实现to引发<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a>)。</span></p><p><span class="yiyi-st" id="yiyi-165">如果<em>skipkeys</em>为false默认值则会尝试对非strintfloat或None的键进行编码的<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a></span><span class="yiyi-st" id="yiyi-166">如果<em>skipkeys</em>为true则此类项目将被直接跳过。</span></p><p><span class="yiyi-st" id="yiyi-167">如果<em>ensure_ascii</em>为true默认值则输出将保证所有传入的非ASCII字符都转义。</span><span class="yiyi-st" id="yiyi-168">如果<em>ensure_ascii</em>为false则这些字符将按原样输出。</span></p><p><span class="yiyi-st" id="yiyi-169">如果<em>check_circular</em>为true默认值则在编码期间将检查列表diction和自定义编码对象的循环引用以防止无限递归这将导致<a class="reference internal" href="exceptions.html#OverflowError" title="OverflowError"><code class="xref py py-exc docutils literal"><span class="pre">OverflowError</span></code></a></span><span class="yiyi-st" id="yiyi-170">否则,不进行这样的检查。</span></p><p><span class="yiyi-st" id="yiyi-171">If <em>allow_nan</em> is true (the default), then <code class="docutils literal"><span class="pre">NaN</span></code>, <code class="docutils literal"><span class="pre">Infinity</span></code>, and <code class="docutils literal"><span class="pre">-Infinity</span></code> will be encoded as such. </span><span class="yiyi-st" id="yiyi-172">此行为不符合JSON规范但与大多数基于JavaScript的编码器和解码器一致。</span><span class="yiyi-st" id="yiyi-173">否则,将对此类浮点进行编码为<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-174">如果<em>sort_keys</em>为真(默认值:<code class="docutils literal"><span class="pre">False</span></code>那么字典的输出将按键排序这对于回归测试非常有用以确保JSON序列化可以在每天的基础上进行比较。</span></p><p><span class="yiyi-st" id="yiyi-175">如果<em>缩进</em>是非负整数或字符串那么JSON数组元素和对象成员将以该缩进级别打印。</span><span class="yiyi-st" id="yiyi-176">缩进级别为0负数或<code class="docutils literal"><span class="pre">""</span></code>将只插入换行符。</span><span class="yiyi-st" id="yiyi-177"><code class="docutils literal"><span class="pre">None</span></code>(默认值)选择最紧凑的表示。</span><span class="yiyi-st" id="yiyi-178">使用正整数缩进缩进,每个级别有许多空格。</span><span class="yiyi-st" id="yiyi-179">如果<em>缩进</em>是字符串(例如<code class="docutils literal"><span class="pre">"\t"</span></code>),则该字符串用于缩进每个级别。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-180"><span class="versionmodified">在版本3.2中更改:</span>允许<em>缩进</em>的字符串以及整数。</span></p></div><p><span class="yiyi-st" id="yiyi-181">如果指定,<em>分隔符</em>应为<code class="docutils literal"><span class="pre">item_separator</span> <span class="pre">key_separator</span></code>元组。</span><span class="yiyi-st" id="yiyi-182">The default is <code class="docutils literal"><span class="pre">(',</span> <span class="pre">',</span> <span class="pre">':</span> <span class="pre">')</span></code> if <em>indent</em> is <code class="docutils literal"><span class="pre">None</span></code> and <code class="docutils literal"><span class="pre">(',',</span> <span class="pre">':</span> <span class="pre">')</span></code> otherwise. </span><span class="yiyi-st" id="yiyi-183">要获得最紧凑的JSON表示应指定<code class="docutils literal"><span class="pre">''</span> <span class="pre">''</span></code></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-184"><span class="versionmodified">在版本3.4中更改:</span>使用<code class="docutils literal"><span class="pre">''</span> <span class="pre">'</span> <span class="pre">')作为默认值,如果<em>缩进</em>不是<code class="docutils literal"><span class="pre">None</span></code></span></code></span></p></div><p><span class="yiyi-st" id="yiyi-185">如果指定,<em>默认</em>应该是一个函数,为不能被序列化的对象调用。</span><span class="yiyi-st" id="yiyi-186">它应该返回对象的JSON可编码版本或引发<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a></span><span class="yiyi-st" id="yiyi-187">如果未指定,则会引发<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a></span></p><dl class="method"><dt id="json.JSONEncoder.default"><span class="yiyi-st" id="yiyi-188"> <code class="descname">default</code><span class="sig-paren">(</span><em>o</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-189">在子类中实现此方法,以便为<em>o</em>返回可序列化对象,或调用基本实现(引入<a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal"><span class="pre">TypeError</span></code></a>)。</span></p><p><span class="yiyi-st" id="yiyi-190">例如,要支持任意迭代器,您可以实现默认像这样:</span></p><pre><code class="language-python"><span></span><span class="k">def</span> <span class="nf">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">iterable</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">o</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">iterable</span><span class="p">)</span>
<span class="c1"># Let the base class default method raise the TypeError</span>
<span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="o">.</span><span class="n">default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">o</span><span class="p">)</span>
</code></pre></dd></dl><dl class="method"><dt id="json.JSONEncoder.encode"><span class="yiyi-st" id="yiyi-191"> <code class="descname">encode</code><span class="sig-paren">(</span><em>o</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-192">返回Python数据结构<em>o</em>的JSON字符串表示形式。</span><span class="yiyi-st" id="yiyi-193">例如:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="p">()</span><span class="o">.</span><span class="n">encode</span><span class="p">({</span><span class="s2">"foo"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"bar"</span><span class="p">,</span> <span class="s2">"baz"</span><span class="p">]})</span>
<span class="go">'{"foo": ["bar", "baz"]}'</span>
</code></pre></dd></dl><dl class="method"><dt id="json.JSONEncoder.iterencode"><span class="yiyi-st" id="yiyi-194"> <code class="descname">iterencode</code><span class="sig-paren">(</span><em>o</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-195">编码给定对象<em>o</em>,并将每个字符串表示形式设置为可用。</span><span class="yiyi-st" id="yiyi-196">例如:</span></p><pre><code class="language-python"><span></span><span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONEncoder</span><span class="p">()</span><span class="o">.</span><span class="n">iterencode</span><span class="p">(</span><span class="n">bigobject</span><span class="p">):</span>
<span class="n">mysocket</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
</code></pre></dd></dl></dd></dl></div><div class="section" id="exceptions"><h2><span class="yiyi-st" id="yiyi-197">19.2.3. </span><span class="yiyi-st" id="yiyi-198">Exceptions</span></h2><dl class="exception"><dt id="json.JSONDecodeError"><span class="yiyi-st" id="yiyi-199"> <em class="property">exception </em><code class="descclassname">json.</code><code class="descname">JSONDecodeError</code><span class="sig-paren">(</span><em>msg</em>, <em>doc</em>, <em>pos</em>, <em>end=None</em><span class="sig-paren">)</span></span></dt><dd><span class="yiyi-st" id="yiyi-201"><blockquote> <div><p>Subclass of <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a> with the following additional attributes:</p> <dl class="attribute"> <dt id="json.JSONDecodeError.msg"> <code class="descname">msg</code></dt> <dd><p>The unformatted error message.</p> </dd></dl> <dl class="attribute"> <dt id="json.JSONDecodeError.doc"> <code class="descname">doc</code></dt> <dd><p>The JSON document being parsed.</p> </dd></dl> <dl class="attribute"> <dt id="json.JSONDecodeError.pos"> <code class="descname">pos</code></dt> <dd><p>The start index of <em>doc</em> where parsing failed.</p> </dd></dl> <dl class="attribute"> <dt id="json.JSONDecodeError.lineno"> <code class="descname">lineno</code></dt> <dd><p>The line corresponding to <em>pos</em>.</p> </dd></dl> <dl class="attribute"> <dt id="json.JSONDecodeError.colno"> <code class="descname">colno</code></dt> <dd><p>The column corresponding to <em>pos</em>.</p> </dd></dl> </div></blockquote></span><div class="versionadded"><p><span class="yiyi-st" id="yiyi-200"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div></dd></dl></div><div class="section" id="standard-compliance-and-interoperability"><h2><span class="yiyi-st" id="yiyi-202">19.2.4. </span><span class="yiyi-st" id="yiyi-203">Standard Compliance and Interoperability</span></h2><p><span class="yiyi-st" id="yiyi-204">JSON格式由<span class="target" id="index-2"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc7159.html"><strong>RFC 7159</strong></a><a class="reference external" href="http://www.ecma-international.org/publications/standards/Ecma-404.htm">ECMA-404</a>指定。</span><span class="yiyi-st" id="yiyi-205">本节详细说明此模块符合RFC的级别。</span><span class="yiyi-st" id="yiyi-206">为了简单起见,不考虑<a class="reference internal" href="#json.JSONEncoder" title="json.JSONEncoder"><code class="xref py py-class docutils literal"><span class="pre">JSONEncoder</span></code></a><a class="reference internal" href="#json.JSONDecoder" title="json.JSONDecoder"><code class="xref py py-class docutils literal"><span class="pre">JSONDecoder</span></code></a>子类以及除明确提及的参数之外的参数。</span></p><p><span class="yiyi-st" id="yiyi-207">此模块以严格的方式不符合RFC实现一些有效的JavaScript但不是有效的JSON的扩展。</span><span class="yiyi-st" id="yiyi-208">尤其是:</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-209">接受和输出无限和NaN数值</span></li><li><span class="yiyi-st" id="yiyi-210">接受对象内的重复名称,并且仅使用最后名称/值对的值。</span></li></ul><p><span class="yiyi-st" id="yiyi-211">由于RFC允许RFC兼容的解析器接受不符合RFC的输入文本所以该模块的解串器在默认设置下技术上符合RFC。</span></p><div class="section" id="character-encodings"><h3><span class="yiyi-st" id="yiyi-212">19.2.4.1. </span><span class="yiyi-st" id="yiyi-213">Character Encodings</span></h3><p><span class="yiyi-st" id="yiyi-214">RFC要求使用UTF-8UTF-16或UTF-32来表示JSON为了实现最大的互操作性推荐使用UTF-8。</span></p><p><span class="yiyi-st" id="yiyi-215">RFC允许尽管不是必需的此模块的序列化器默认设置为<em>ensure_ascii = True</em>从而转义输出以使结果字符串只包含ASCII字符。</span></p><p><span class="yiyi-st" id="yiyi-216">除了<em>ensure_ascii</em>参数之外此模块严格按照Python对象和<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">Unicode</span> <span class="pre">strings</span></code></a>并且因此不另外直接解决字符编码的问题。</span></p><p><span class="yiyi-st" id="yiyi-217">RFC禁止在JSON文本的开头添加字节顺序标记BOM并且此模块的序列化程序不会向其输出添加BOM。</span><span class="yiyi-st" id="yiyi-218">RFC允许但不要求JSON解串器在其输入中忽略初始BOM。</span><span class="yiyi-st" id="yiyi-219">当存在初始BOM时此模块的解串器引发<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a></span></p><p><span class="yiyi-st" id="yiyi-220">RFC没有明确禁止包含不对应于有效Unicode字符的字节序列的JSON字符串。</span><span class="yiyi-st" id="yiyi-221">不成对的UTF-16代理但它确实注意到它们可能导致互操作性问题。</span><span class="yiyi-st" id="yiyi-222">默认情况下,此模块接受和输出(当存在于原始<a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal"><span class="pre">str</span></code></a>)这样的序列的代码点。</span></p></div><div class="section" id="infinite-and-nan-number-values"><h3><span class="yiyi-st" id="yiyi-223">19.2.4.2. </span><span class="yiyi-st" id="yiyi-224">Infinite and NaN Number Values</span></h3><p><span class="yiyi-st" id="yiyi-225">RFC不允许表示无限或NaN数值。</span><span class="yiyi-st" id="yiyi-226">尽管如此,默认情况下,此模块接受并输出<code class="docutils literal"><span class="pre">Infinity</span></code><code class="docutils literal"><span class="pre">-Infinity</span></code><code class="docutils literal"><span class="pre">NaN</span></code>如同它们是有效的JSON数字面值值</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="c1"># Neither of these calls raises an exception, but the results are not valid JSON</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="s1">'-inf'</span><span class="p">))</span>
<span class="go">'-Infinity'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="s1">'nan'</span><span class="p">))</span>
<span class="go">'NaN'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="c1"># Same when deserializing</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="s1">'-Infinity'</span><span class="p">)</span>
<span class="go">-inf</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="s1">'NaN'</span><span class="p">)</span>
<span class="go">nan</span>
</code></pre><p><span class="yiyi-st" id="yiyi-227">在序列化程序中,可以使用<em>allow_nan</em>参数来更改此行为。</span><span class="yiyi-st" id="yiyi-228">在解串器中,<em>parse_constant</em>参数可用于更改此行为。</span></p></div><div class="section" id="repeated-names-within-an-object"><h3><span class="yiyi-st" id="yiyi-229">19.2.4.3. </span><span class="yiyi-st" id="yiyi-230">Repeated Names Within an Object</span></h3><p><span class="yiyi-st" id="yiyi-231">RFC指定JSON对象中的名称应该是唯一的但不要求如何处理JSON对象中的重复名称。</span><span class="yiyi-st" id="yiyi-232">默认情况下,此模块不引发异常;相反,它忽略除了给定名称的最后一个名称/值对之外的所有值:</span></p><pre><code class="language-python"><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">weird_json</span> <span class="o">=</span> <span class="s1">'{"x": 1, "x": 2, "x": 3}'</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">weird_json</span><span class="p">)</span>
<span class="go">{'x': 3}</span>
</code></pre><p><span class="yiyi-st" id="yiyi-233">可以使用<em>object_pairs_hook</em>参数更改此行为。</span></p></div><div class="section" id="top-level-non-object-non-array-values"><h3><span class="yiyi-st" id="yiyi-234">19.2.4.4. </span><span class="yiyi-st" id="yiyi-235">Top-level Non-Object, Non-Array Values</span></h3><p><span class="yiyi-st" id="yiyi-236">由过时的<span class="target" id="index-3"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc4627.html"><strong>RFC 4627</strong></a>指定的旧版本JSON要求JSON文本的顶级值必须是JSON对象或数组Python <a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal"><span class="pre">dict</span></code></a><a class="reference internal" href="stdtypes.html#list" title="list"><code class="xref py py-class docutils literal"><span class="pre">list</span></code></a>并且不能是JSON空值布尔值数字或字符串值。</span><span class="yiyi-st" id="yiyi-237"><span class="target" id="index-4"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc7159.html"><strong>RFC 7159</strong></a>删除了该限制,此模块不会,也从未在其序列化器或其解串器中实现此限制。</span></p><p><span class="yiyi-st" id="yiyi-238">无论如何,为了实现最大的互操作性,您可能希望自愿遵守该限制。</span></p></div><div class="section" id="implementation-limitations"><h3><span class="yiyi-st" id="yiyi-239">19.2.4.5. </span><span class="yiyi-st" id="yiyi-240">Implementation Limitations</span></h3><p><span class="yiyi-st" id="yiyi-241">一些JSON解串器实现可能设置以下限制</span></p><ul class="simple"><li><span class="yiyi-st" id="yiyi-242">接受的JSON文本的大小</span></li><li><span class="yiyi-st" id="yiyi-243">JSON对象和数组的最大嵌套级别</span></li><li><span class="yiyi-st" id="yiyi-244">JSON数字的范围和精度</span></li><li><span class="yiyi-st" id="yiyi-245">JSON字符串的内容和最大长度</span></li></ul><p><span class="yiyi-st" id="yiyi-246">除了相关的Python数据类型本身或Python解释器本身之外此模块不强加任何此类限制。</span></p><p><span class="yiyi-st" id="yiyi-247">当序列化为JSON时请注意可能会消耗您的JSON的应用程序中的任何此类限制。</span><span class="yiyi-st" id="yiyi-248">特别地通常将JSON数字反序列化为IEEE 754双精度数字并且因此服从于该表示的范围和精度限制。</span><span class="yiyi-st" id="yiyi-249">当序列化非常大的Python <a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal"><span class="pre">int</span></code></a>值或者序列化“异常”数值类型的实例(例如<a class="reference internal" href="decimal.html#decimal.Decimal" title="decimal.Decimal"><code class="xref py py-class docutils literal"><span class="pre">decimal.Decimal</span></code></a>)时,这一点尤其重要。</span></p></div></div><div class="section" id="module-json.tool"><h2><span class="yiyi-st" id="yiyi-250">19.2.5. </span><span class="yiyi-st" id="yiyi-251">Command Line Interface</span></h2><p><span class="yiyi-st" id="yiyi-252"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/json/tool.py">Lib / json / tool.py</a></span></p><p><span class="yiyi-st" id="yiyi-253"><a class="reference internal" href="#module-json.tool" title="json.tool: A command line to validate and pretty-print JSON."><code class="xref py py-mod docutils literal"><span class="pre">json.tool</span></code></a>模块提供了一个简单的命令行界面来验证和美观打印JSON对象。</span></p><p><span class="yiyi-st" id="yiyi-254">如果未指定可选的<code class="docutils literal"><span class="pre">infile</span></code><code class="docutils literal"><span class="pre">outfile</span></code>参数,将分别使用<a class="reference internal" href="sys.html#sys.stdin" title="sys.stdin"><code class="xref py py-attr docutils literal"><span class="pre">sys.stdin</span></code></a><a class="reference internal" href="sys.html#sys.stdout" title="sys.stdout"><code class="xref py py-attr docutils literal"><span class="pre">sys.stdout</span></code></a> </span></p><div class="highlight-bash"><div class="highlight"><pre><span></span>$ <span class="nb">echo</span> <span class="s1">'{"json": "obj"}'</span> <span class="p">|</span> python -m json.tool
<span class="o">{</span>
<span class="s2">"json"</span>: <span class="s2">"obj"</span>
<span class="o">}</span>
$ <span class="nb">echo</span> <span class="s1">'{1.2:3.4}'</span> <span class="p">|</span> python -m json.tool
Expecting property name enclosed in double quotes: line <span class="m">1</span> column <span class="m">2</span> <span class="o">(</span>char 1<span class="o">)</span>
</pre></div></div><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-255"><span class="versionmodified">在版本3.5中更改:</span>输出现在与输入处于相同的顺序。</span><span class="yiyi-st" id="yiyi-256">使用<a class="reference internal" href="#cmdoption--sort-keys"><code class="xref std std-option docutils literal"><span class="pre">--sort-keys</span></code></a>选项按字母顺序对字典的输出进行排序。</span></p></div><div class="section" id="command-line-options"><h3><span class="yiyi-st" id="yiyi-257">19.2.5.1. </span><span class="yiyi-st" id="yiyi-258">Command line options</span></h3><dl class="cmdoption"><dt id="cmdoption-arg-infile"><span class="yiyi-st" id="yiyi-259"> <code class="descname">infile</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-260">要验证或打印的JSON文件</span></p><div class="highlight-bash"><div class="highlight"><pre><span></span>$ python -m json.tool mp_films.json
<span class="o">[</span>
<span class="o">{</span>
<span class="s2">"title"</span>: <span class="s2">"And Now for Something Completely Different"</span>,
<span class="s2">"year"</span>: 1971
<span class="o">}</span>,
<span class="o">{</span>
<span class="s2">"title"</span>: <span class="s2">"Monty Python and the Holy Grail"</span>,
<span class="s2">"year"</span>: 1975
<span class="o">}</span>
<span class="o">]</span>
</pre></div></div><p><span class="yiyi-st" id="yiyi-261">如果未指定<em>infile</em>,请从<a class="reference internal" href="sys.html#sys.stdin" title="sys.stdin"><code class="xref py py-attr docutils literal"><span class="pre">sys.stdin</span></code></a>中读取。</span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption-arg-outfile"><span class="yiyi-st" id="yiyi-262"> <code class="descname">outfile</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-263"><em>infile</em>的输出写入给定的<em>outfile</em></span><span class="yiyi-st" id="yiyi-264">否则,将其写入<a class="reference internal" href="sys.html#sys.stdout" title="sys.stdout"><code class="xref py py-attr docutils literal"><span class="pre">sys.stdout</span></code></a></span></p></dd></dl><dl class="cmdoption"><dt id="cmdoption--sort-keys"><span class="yiyi-st" id="yiyi-265"> <code class="descname">--sort-keys</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-266">按字母顺序按字母顺序排序字典的输出。</span></p><div class="versionadded"><p><span class="yiyi-st" id="yiyi-267"><span class="versionmodified">版本3.5中的新功能。</span></span></p></div></dd></dl><dl class="cmdoption"><dt id="cmdoption-h"><span class="yiyi-st" id="yiyi-268"> <span id="cmdoption--help"></span><code class="descname">-h</code><code class="descclassname"></code><code class="descclassname">, </code><code class="descname">--help</code><code class="descclassname"></code></span></dt><dd><p><span class="yiyi-st" id="yiyi-269">显示帮助消息。</span></p></dd></dl><p class="rubric"><span class="yiyi-st" id="yiyi-270">脚注</span></p><table class="docutils footnote" frame="void" id="rfc-errata" rules="none"><tbody valign="top"><tr><td class="label"><span class="yiyi-st" id="yiyi-271"><a class="fn-backref" href="#id1">[1]</a></span></td><td><span class="yiyi-st" id="yiyi-272">正如<a class="reference external" href="https://www.rfc-editor.org/errata_search.php?rfc=7159">RFC 7159</a>的勘误中所述JSON允许字符串中的字面值U + 2028LINE SEPARATOR和U + 2029PARAGRAPH SEPARATOR字符而JavaScriptECMAScript Edition 5.1版) 。</span></td></tr></tbody></table></div></div></div></div>