Python json编码API的字典值

时间:2016-02-19 12:39:11

标签: python json csv dictionary

Python初学者在这里;

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

该脚本使用两个For循环,一个用于从CSV读取条目并将它们添加到Dictionary中,第二个脚本将字典条目中的数据替换为模板字符串,该字符串通过转换为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.dump解析的,但似乎无法正常工作。

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

看起来你从源代码中获取了具有编码功能的数据&#39; Cp1252&#39; 您可以将字典作为

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)