【问题标题】:How can I serialize this Python dict?如何序列化这个 Python 字典?
【发布时间】:2017-10-20 18:20:01
【问题描述】:

我正在尝试序列化一个字典(由其他字典组装而成),无论我做什么,我似乎都无法序列化这个傻瓜。 Json.dumps() 抛出一个类型错误并说它是不可序列化的。

这是 unicode 问题还是数据类型问题?一切都应该是一个字符串或整数

编辑:

  • 更新了 JSON sn-p - 没有格式化,所以希望这次没有括号遗漏)

  • 字典是使用 Alexa Skills Kit 的 Flask-Ask 扩展中的上下文局部变量构建的。所以,我的意思是,如果{u'foo': u'bar'} 结构中存在 unicode / 语法错误,它应该来自那里。

{'event': {'session': {u'application': {u'applicationId': u'amzn1.ask.skill.9633f809-4141-4cf8-b5f4-5b605e597758'}, u'sessionId': u'amzn1 .echo-api.session.68d0c695-bb6c-4929-96d0-6eed0ed9c413' ,u'user ':{u'userId':u'amzn1.ask.account.AGN4D7NM4VKGNCCTCMD3OWT2GR6YKIQF7TODTS4LXUW7UMEVKK6TTKC3JUM25EX3AT4W6WQYCHINGWKWV6TTTNH72U4KL4FH3LXSH3666E3YWPJMYHBDMVDMQZ5SNCIRSTL4BSOMF2V6TNH7I6T4E2NY7IMDPDIIZX3GXDYHZX2NKYELYZE5NE63LJMBAYFE3ZOMRA3F66QYMCY 'u'accessToken':u'Atza | IwEBIBFtege3DE13oOO5xiztl3aHcq0mE5dno1lo0p6579 -WzNTCNaCvjZicNU-GR5BbDmNWGxjQIk-wnuopeywFQ7vJx-utWTIQrJMXh0AUWJExktH2CiwQmy1sdf9mAvaUTYtTpfxB3J5NGVcE7aeYAMenPiDtSq6yvyjLyjF6V8HqQBxRNiStieHG-YJLCW1oOWs84V143L6wcrgQv5BK-siZAJDcBK_6jiXDFE9cgfIjVpLiSyAH1IqfhJ4-9Gc5CvOAmRVsWCGgxaV-aMntA7FlOnG1eP6ilk81HWRgVusdfy7x7JDxMhEzkHF6l11g9jUFwtAkVIa-9wMedGG6XPFbyNlEbqa6XJuOiawHs9LYDVuAIYRrPyVrF_MANbKApRSrzAX-GFjVC3MSQU48-ySbCxSfo4D5dRlHS8c_3_cFxr8etnEX17HY5G9oC1uYGjEsdfHuDVBUJ3FP65flxRye9zL7S3UBJBwRkxXLiC8iBifb-5sMLnKn7gw8RRe-y3cNCZnCxtmEGzSp HWscxd6v9xsdfdxzf4BXiUaTgpI2oW6JFhXDKotdf_WY-mSsix0URJrwwicC8bQ'},'属性':{'name':u'Foo Bar','zip':u'11295','userId':u'amzn1.account.AHARAFOFWsdfT7QWD6FXOQRLZ': /New_York','lat':40.6945036,'lng':-73.9565551,'email':u'foo@bar.com'},u'new':'True'},'version':'1.0',' request': {u'locale': u'en-US', u'timestamp': u'2017-10-20T18:22:42Z', u'type': u'LaunchRequest', u'requestId': u 'amzn1.echo-api.request.770f8588-aa1d-443a-b7f6-39abe079e474'},'响应':{u'version':u'1.0',u'response':{u'outputSpeech':{u' text': u'欢迎来到约会之夜!你是呆在家里还是出去?', u'type': u'PlainText'}, u'shouldEndSession': 'False', u'reprompt': {u'outputSpeech': {u'text': u'Hey , 欢迎来到约会之夜!你是住还是出去?', u'type': u'PlainText'}}}, u'sessionAttributes': {u'name': u'Foo Bar', u'zip': u'11295', u'userId': u'amzn1.account.AHARAFOsdfsdfsdfFWT7QWD6FXOQRLZR577OA', u'tzid': u'America/New_York', u'lat': 40.6945036, u'lng': -73.9565551, u'email': u'foo@ bar.com'}}}}

代码:

这是我的这个函数的代码:

print ask_version
print ask_session
print ask_request 
print resp # resp is None in this case
ask_session.pop('dialogState', None)
#ask_session['new'] = str(ask_session['new'])

payload = {
    "event" : {
        "version": str(ask_version).encode('utf8'),
        "session": ask_session,
        "request": ask_request
    } 
}

if resp is not None:
    payload['event']['response'] = json.loads(str(resp))
    #payload['event']['response']['response']['shouldEndSession'] = str(payload['event']['response']['response']['shouldEndSession'])

print payload # works fine
print json.dumps(payload) # throws an error

控制台输出

1.0 {'dialogState':无,u'application':{u'applicationId':u'amzn1.ask.skill.9633f809-4141-4cf8-b5f4-5b605e597758'},u'sessionId':u'amzn1.echo-api .session.354294b7-78ce-4c47-8673-f671ecb750a6' ,u'user ':{u'userId':u'amzn1.ask.account.AGN4D7NM4VKGNCCTCMD3OWT2GR6YKIQF7TODTS4LXUW7UMEVKK6TTKC3JUM25EX3AT4W6WQYCHINGWKWV6TTTNH72U4KL4FH3LXSH3666E3YWPJMYHBDMVDMQZ5SNCIRSTL4BSOMF2V6TNH7I6T4E2NY7IMDPDIIZX3GXDYHZX2NKYELYZE5NE63LJMBAYFE3ZOMRA3F66QYMCY 'u'accessToken':u'Atza | E5dno1lo0p6579-WzNTCNaCvjZicNU-GR5BbDmNWGxjQIk -wnuopeywFQ7vJx-utWTIQrJMXh0AUWJExktH2CiwQmy19mAvaUTYtTpfxB3J5NGVcE7aeYAMenPiDtSq6yvyjLyjF6V8HqQBxRNiStieHG-YJLCW1oOWs84V143L6wcrgQv5BK-siZAJDcBK_6jiXDFE9cgfIjVpLiSyAH1IqfhJ4-9Gc5CvOAmRVsWCGgxaV-aMntA7FlOnG1eP6ilk81HWRgVuy7x7JDxMhEzkHF6l11g9jUFwtAkVIa-9wMedGG6XPFbyNlEbqa6XJuOiawHs9LYDVuAIYRrPyVrF_MANbKApRSrzAX-GFjVC3MSQU48-ySbCxSfo4D5dRlHS8c_3_cFxr8etnEX17HY5G9oC1uYGjEHuDVBUJ3FP65flxRye9zL7S3UBJBwRkxXLiC8iBifb-5sMLnKn7gw8RRe-y3cNCZnCxtmEGzSpHWscxd6v9xdxzf4BXiUaTgpI2oW6JFhXDKotdf_WY- mSsix0URJrwwicC8bQ'}, 'attributes': {'name': u'Foo Bar', 'zip': u'11205', 'userId': u'amzn1.account.AHARAFOFWT7QWD6FXOQRLZR577OA', 'tzid': u'America/New_York ', 'lat': 40.99999, 'lng': -73.99999, 'email': u'foo@bar.com'}, u'new': True} {u'locale': u'en-US', u'timestamp': u'2017-10-20T18:38:32Z', u'type': u'LaunchRequest', u'requestId': u'amzn1. echo-api.request.99b6181b-7e28-4c1d-a49d-ed1f9d0d8c8d'} 没有任何 {'event': {'session': {u'application': {u'applicationId': u'amzn1.ask.skill.9633f809-4141-4cf8-b5f4-5b605e597758'}, u'sessionId': u'amzn1 .echo-api.session.354294b7-78ce-4c47-8673-f671ecb750a6' ,u'user ':{u'userId':u'amzn1.ask.account.AGN4D7NM4VKGNCCTCMD3OWT2GR6YKIQF7TODTS4LXUW7UMEVKK6TTKC3JUM25EX3AT4W6WQYCHINGWKWV6TTTNH72U4KL4FH3LXSH3666E3YWPJMYHBDMVDMQZ5SNCIRSTL4BSOMF2V6TNH7I6T4E2NY7IMDPDIIZX3GXDYHZX2NKYELYZE5NE63LJMBAYFE3ZOMRA3F66QYMCY 'u'accessToken':u'Atza | E5dno1lo0p6579 -WzNTCNaCvjZicNU-GR5BbDmNWGxjQIk-wnuopeywFQ7vJx-utWTIQrJMXh0AUWJExktH2CiwQmy19mAvaUTYtTpfxB3J5NGVcE7aeYAMenPiDtSq6yvyjLyjF6V8HqQBxRNiStieHG-YJLCW1oOWs84V143L6wcrgQv5BK-siZAJDcBK_6jiXDFE9cgfIjVpLiSyAH1IqfhJ4-9Gc5CvOAmRVsWCGgxaV-aMntA7FlOnG1eP6ilk81HWRgVuy7x7JDxMhEzkHF6l11g9jUFwtAkVIa-9wMedGG6XPFbyNlEbqa6XJuOiawHs9LYDVuAIYRrPyVrF_MANbKApRSrzAX-GFjVC3MSQU48-ySbCxSfo4D5dRlHS8c_3_cFxr8etnEX17HY5G9oC1uYGjEHuDVBUJ3FP65flxRye9zL7S3UBJBwRkxXLiC8iBifb-5sMLnKn7gw8RRe-y3cNCZnCxtmEGzSpHWscxd6v9xdxzf4BXiUaTgpI2oW6JFhXDKotdf_WY -mSsix0URJrwwicC8bQ'}, 'attributes': {'name': u'Foo Bar', 'zip': u'11205', 'userId': u'amzn1.account.AHARAFOFWT7QWD6FXOQRLZR577OA', 'tzid': u'America/ New_York','lat':40.99999,'lng':-73.99999,'email':u'foo@bar.com'},u'new':True},'version':'1.0','request': {u'locale': u'en-US', u'timestamp': u'2017-10-20T18:38:32Z', u'type': u'LaunchRequest', u'requestId': u'amzn1. echo-api.request.99b6181b-7e28-4c1d-a49d-ed1f9d0d8c8d'}}} 2017-10-20 11:38:35,551 INFO 127.0.0.1 - - [20/Oct/2017 11:38:35] “POST /alexa/HTTP/1.1”500 - 回溯(最近一次通话最后): __call__ 中的文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1997 行 return self.wsgi_app(environ, start_response) wsgi_app 中的文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1985 行 响应 = self.handle_exception(e) 文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1540 行,在 handle_exception reraise(exc_type, exc_value, tb) wsgi_app 中的文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1982 行 响应 = self.full_dispatch_request() 文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1614 行,在 full_dispatch_request rv = self.handle_user_exception(e) 文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1517 行,在 handle_user_exception reraise(exc_type, exc_value, tb) 文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1612 行,在 full_dispatch_request rv = self.dispatch_request() 文件“/usr/local/lib/python2.7/site-packages/flask/app.py”,第 1598 行,在 dispatch_request 中 return self.view_functions[rule.endpoint](**req.view_args) _flask_view_func 中的文件“/usr/local/lib/python2.7/site-packages/flask_ask/core.py”,第 663 行 结果 = self._launch_view_func() 文件“/Users/Neal/Documents/repos/nealrs_heroku/application.py”,第 738 行,在启动中 dashbot(“传入”) dashbot 中的文件“/Users/Neal/Documents/repos/nealrs_heroku/application.py”,第 665 行 打印 json.dumps(有效负载) 转储中的文件“/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py”,第 244 行 返回 _default_encoder.encode(obj) 文件“/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py”,第 207 行,编码 块 = self.iterencode(o, _one_shot=True) 文件“/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py”,第 270 行,在 iterencode 返回 _iterencode(o, 0) 文件“/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py”,第 184 行,默认 raise TypeError(repr(o) + "不是 JSON 可序列化") TypeError: {u'application': {u'applicationId': u'amzn1.ask.skill.9633f809-4141-4cf8-b5f4-5b605e597758'}, u'sessionId': u'amzn1.echo-api.session.354294b7 -78ce-4c47-8673-f671ecb750a6' ,u'user ':{u'userId':u'amzn1.ask.account.AGN4D7NM4VKGNCCTCMD3OWT2GR6YKIQF7TODTS4LXUW7UMEVKK6TTKC3JUM25EX3AT4W6WQYCHINGWKWV6TTTNH72U4KL4FH3LXSH3666E3YWPJMYHBDMVDMQZ5SNCIRSTL4BSOMF2V6TNH7I6T4E2NY7IMDPDIIZX3GXDYHZX2NKYELYZE5NE63LJMBAYFE3ZOMRA3F66QYMCY 'u'accessToken':u'Atza | E5dno1lo0p6579-WzNTCNaCvjZicNU-GR5BbDmNWGxjQIk-wnuopeywFQ7vJx-utWTIQrJMXh0AUWJExktH2CiwQmy19mAvaUTYtTpfxB3J5NGVcE7aeYAMenPiDtSq6yvyjLyjF6V8HqQBxRNiStieHG -YJLCW1oOWs84V143L6wcrgQv5BK-siZAJDcBK_6jiXDFE9cgfIjVpLiSyAH1IqfhJ4-9Gc5CvOAmRVsWCGgxaV-aMntA7FlOnG1eP6ilk81HWRgVuy7x7JDxMhEzkHF6l11g9jUFwtAkVIa-9wMedGG6XPFbyNlEbqa6XJuOiawHs9LYDVuAIYRrPyVrF_MANbKApRSrzAX-GFjVC3MSQU48-ySbCxSfo4D5dRlHS8c_3_cFxr8etnEX17HY5G9oC1uYGjEHuDVBUJ3FP65flxRye9zL7S3UBJBwRkxXLiC8iBifb-5sMLnKn7gw8RRe-y3cNCZnCxtmEGzSpHWscxd6v9xdxzf4BXiUaTgpI2oW6JFhXDKotdf_WY-mSsix0URJr wwicC8bQ'}, 'attributes': {'name': u'Foo Bar', 'zip': u'11205', 'userId': u'amzn1.account.AHARAFOFWT7QWD6FXOQRLZR577OA', 'tzid': u'America/New_York ', 'lat': 40.99999, 'lng': -73.99999, 'email': u'foo@bar.com'}, u'new': True} 不是 JSON 可序列化的

【问题讨论】:

  • 如果这是 Python 2,您正在混合使用 strunicode 类型。
  • 另外,我很确定这有不平衡的括号......
  • u 'application'(还有很多其他人)在我看来就像SyntaxError
  • 每个u 后面都有一个空格...这是语法错误...
  • 是的,实际上,这根本不是一个有效的 Python 文字。这是如何产生的?你是手工制作的吗?

标签: python json dictionary flask


【解决方案1】:

有时您会遇到在打印时看起来像普通dict 的对象,但实际上并非如此。这在 Web 框架中尤其常见。尝试将其转换为json 模块知道如何序列化的普通dict

ask_session = dict(ask_session)

如果您有嵌套数据结构,可能会出现一个问题。在这种情况下,为该类型添加自定义编码器可能会更好。例如:https://stackoverflow.com/a/3768975/982257

虽然可能没有必要。 Flask 有一个名为jsonify 的内置实用函数,它知道如何处理 Flask 中出现的许多类型。在这种情况下我没有对其进行测试,但我几乎总是在编写 Flask 应用程序时使用它。

【讨论】:

  • 查看了上下文本地文档,似乎ask_version._get_current_object() 是正确的方法。终于生成了有效的json!非常感谢您暗示我的字典可能不是真正的字典。
  • 试试jsonify,如果你还没有。它可能已经处理好了。
【解决方案2】:

看起来 jsonify 和 dict() 不够聪明,无法处理 Flask 的上下文本地变量 (<class 'werkzeug.local.LocalProxy'>)。唯一对我有用的是使用._get_current_object() 将代理作为字典访问。将其插入json.dumps(),你会很好。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 2021-05-30
    • 2011-05-18
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多