<p>出现此错误是因为您没有使用<code>oauth2client</code>所期望的json格式。{<cd2>}的{a1}表示:</p>
<blockquote>
<p>class method new_from_json(json_data)[source] Utility class method to
instantiate a Credentials subclass from JSON.</p>
<p><strong>Expects the JSON string to have been produced by to_json().</strong></p>
<p>Parameters: json_data – string or bytes, JSON from to_json().</p>
<p>Returns: An instance of the subclass of Credentials that was
serialized with to_json().</p>
</blockquote>
<p>这里的关键是,它希望您给它的json对象是它作为类的序列化实例生成的对象。您不能只给它任何arrbitrary json对象,然后期望它知道该做什么</p>
<p>当您从modules<code>to_json</code>方法生成JSON序列化凭证对象时,它将设置<code>_module</code>和<code>_class</code>数据</p>
<pre class="lang-py prettyprint-override"><code>
# Add in information we will need later to reconstitute this instance.
to_serialize['_class'] = curr_type.__name__
to_serialize['_module'] = curr_type.__module__
</code></pre>
<p>这一点很重要的原因是,当您稍后尝试执行<code>new_from_json</code>时,它将执行这部分代码</p>
<pre class="lang-py prettyprint-override"><code>
# Find and call the right classmethod from_json() to restore
# the object.
module_name = data['_module']
</code></pre>
<p>在您的情况下,这会失败,因为您使用的json不是模块生成的json凭证对象。这一点很重要的原因是,在代码的后面,它需要知道要返回给您的服务帐户对象</p>
<pre class="lang-py prettyprint-override"><code> def from_json(cls, json_data):
# TODO(issue 388): eliminate the circularity that is the reason for
# this non-top-level import.
from oauth2client import service_account
data = json.loads(_helpers._from_bytes(json_data))
# We handle service_account.ServiceAccountCredentials since it is a
# possible return type of GoogleCredentials.get_application_default()
if (data['_module'] == 'oauth2client.service_account' and
data['_class'] == 'ServiceAccountCredentials'):
return service_account.ServiceAccountCredentials.from_json(data)
elif (data['_module'] == 'oauth2client.service_account' and
data['_class'] == '_JWTAccessCredentials'):
return service_account._JWTAccessCredentials.from_json(data)
</code></pre>
<p>长话短说,你不能给它任何旧的json并期望它工作。你需要首先在类中创建你的凭证对象,然后调用它的to_json方法,然后序列化该对象,以便以后能够使用它从存储中加载凭证</p>