为什么json.dumps()和json.loads()会产生unicode字符串?

时间:2018-05-25 15:58:27

标签: python json unicode

  

{' created_at&#39 ;: datetime.datetime(2018,5,25,13,​​35,11),' tweet':   " RT @KKRiders:Mavi将#Qualifier2的第一球打成碗。萨哈   罢工。我们走吧!\ n \ n#SRHvKKR #TeesraVaar #KKRHaiTaiyaar",' id':   1000007371131764736,' sequence':1}

这是我的字符串,我需要在json中。

def myconverter(o):
    if isinstance(o, datetime.datetime):
        return o.__str__()
messageRead = json.dumps(message.value, default = myconverter)
messageRead = json.loads(messageRead)
print messageRead
print type(messageRead)

2 个答案:

答案 0 :(得分:2)

你的json无效。要解决此问题,请先修改字符串:

  • datetime.datetime(2018, 5, 25, 13, 35, 11)不是有效字符串。您可以将其作为字符串传递,并在加载后解析它。
  • 删除\n
  • '替换为"(Python支持',但JSON不支持)
  • JSON 中也不允许
  • \'

您的字符串可能如下所示:

  

{“created_at”:“datetime.datetime(2018,5,25,13,​​35,11)”,     “鸣叫”:“RT @KKRiders:Mavi将#Qualifier2的第一球打成两球。   萨哈罢工。我们走了!#SRHvKKR #TeesraVaar #KKRHaiTaiyaar“,”id“:   1000007371131764736,“序列”:1}

要检查您的json是否有效,请使用:https://jsonlint.com/

请参阅此处的JSON RFC以了解JSON支持的内容:https://tools.ietf.org/html/rfc7159

答案 1 :(得分:1)

这就是json.loads在python2.7中的工作方式。 最简单的方法是切换到python3。如果你想坚持使用python2.7,你可以使用object_pairs_hook。

import datetime
import json


message = {
   'created_at': datetime.datetime(2018, 5, 25, 13, 35, 11),
   'tweet': "RT @KKRiders: Mavi to bowl the first ball of #Qualifier2. Saha on strike. Let's go!\n\n#SRHvKKR #TeesraVaar #KKRHaiTaiyaar",
   'id': 1000007371131764736,
   'sequence': 1}
def myconverter(o):
    if isinstance(o, datetime.datetime):
        return o.__str__()

def object_pairs_hook(pairs):
    new_pairs = []
    for key, value in pairs:
        if isinstance(value, unicode):
            try:
                value = datetime.datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
            except:
                value = value.encode('utf-8')
        if isinstance(key, unicode):
            key = key.encode('utf-8')
        new_pairs.append((key, value))
    return dict(new_pairs)


messageRead = json.dumps(message, default = myconverter)
messageRead = json.loads(messageRead, object_pairs_hook=object_pairs_hook)
print messageRead

请注意,如果您希望将列表和词典用作值,则必须修改object_pairs_hook