【问题标题】:Python json encode dictionary value for APIPython json 编码 API 的字典值
【发布时间】:2016-02-19 12:39:11
【问题描述】:

这里是Python初学者;

我有一个来自 Excel 的 CSV 文件。我想将条目解析为 JSON 字符串,以便与内部应用程序的 API 一起使用。

该脚本使用两个 For 循环,一个从 CSV 读取条目并将它们添加到字典中,第二个将字典条目中的数据替换为模板字符串,该字符串通过转换为 JSON 字符串来为 API 请求正确格式化。

这是一个填充字典条目的示例 - 格式对应于 API 规范;

{'description': 'Mrs Davies 7M3/It', 'resourceId': '16', 'userId': 26, 'accessories': [], 'startReminder': '', 'recurrenceRule': {'monthlyType': 'null', 'interval': 2, 'type': 'weekly', 'weekdays': [1], 'repeatTerminationDate': '2016-05-29T08:50:00'}, 'title': 'Mrs Davies 7M3/It', 'resourceID': '16', 'endDateTime': '2016\xad02\xad22T10:50:00', 'participants': [], 'customAttributes': [], 'endReminder': '', 'startDateTime': '2016\xad02\xad22T09:50:00', 'resources': ['16'], 'invitees': []}

如您所见,startDataTime 和 endDateTime 的连字符为十六进制值。

'endDateTime': '2016\xad02\xad22T10:50:00'

如果我将此值作为变量 (tempData) 传递,如下所示;

res_data = json.dumps(tempData)

我得到了错误;

     Traceback (most recent call last):
         File "api.py", line 70, in <module>
           res_data = json.dumps(tempData) 
         File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps
           return _default_encoder.encode(obj)
         File "/usr/lib/python2.7/json/encoder.py", line 207, in encode
           chunks = self.iterencode(o, _one_shot=True)
         File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode
           return _iterencode(o, 0)
         UnicodeDecodeError: 'utf8' codec can't decode byte 0xad in position 4: invalid start byte

脚本一直运行到现在没有问题。我试图重新编码通过 json.dumps 解析的数据,但似乎不起作用。

有没有办法从字典中将数据编码为 utf8?

提前致谢。

【问题讨论】:

    标签: python json csv dictionary


    【解决方案1】:

    看起来您从编码为“Cp1252”的源获取数据 您可以将字典作为

    data = {1:2, 'endDateTime': '2016\xad02\xad22T10:50:00'.decode('cp1252')}
    json.dump(data)
    '{"1": 2, "endDateTime": "2016\\u00ad02\\u00ad22T10:50:00"}'
    

    如果你对编码类型不是很确定,并且已经有了这样的字符串字典,那么你可以让 json 来处理它-

    json.dumps({'endDateTime': '2016\xad02\xad22T10:50:00'}, ensure_ascii=False)
    # It prints '{"endDateTime": "2016\xad02\xad22T10:50:00"}'
    

    您的代码应该适用于以下更改

    res_data = json.dumps(tempData, ensure_ascii=False)
    

    【讨论】:

    • 谢谢,有趣的是我以前也有过,但什么也没做。我已经添加了它,现在正在创建 JSON 字符串,但我有一个额外的错误,这可能是我的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2021-08-24
    相关资源
    最近更新 更多