【问题标题】:Why are json.dumps() and json.loads() yielding unicode string? [closed]为什么 json.dumps() 和 json.loads() 会产生 unicode 字符串? [关闭]
【发布时间】:2018-05-25 15:58:26
【问题描述】:

{'created_at': datetime.datetime(2018, 5, 25, 13, 35, 11), 'tweet': “RT @KKRiders:Mavi 打出#Qualifier2 的第一个球。Saha on 罢工。走吧!\n\n#SRHvKKR #TeesraVaar #KKRhaiTaiyaar", 'id': 1000007371131764736,'序列':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)

【问题讨论】:

    标签: python json unicode


    【解决方案1】:

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

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

    为了被阅读,您的字符串可能看起来像这样:

    { "created_at": "datetime.datetime(2018, 5, 25, 13, 35, 11)", “tweet”:“RT @KKRiders:Mavi 打出#Qualifier2 的第一个球。 萨哈罢工。走吧!#SRHvKKR #TeesraVaar #KKRHaiTaiyaar", "id": 1000007371131764736,“序列”:1}

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

    请参阅此处的 JSON RFC 以了解 JSON 支持的内容:https://www.rfc-editor.org/rfc/rfc7159

    【讨论】:

      【解决方案2】:

      这就是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 将列表和字典作为值使用,则必须修改它

      【讨论】:

        猜你喜欢
        • 2014-03-15
        • 2022-07-06
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 2015-12-30
        相关资源
        最近更新 更多