【问题标题】:Deserializing JSON Date field in Python/Django在 Python/Django 中反序列化 JSON 日期字段
【发布时间】:2017-03-02 10:47:19
【问题描述】:

我正在尝试将网络爬虫应用程序从 .Net 移植到 Python。它接收类似于以下的 json 响应:

[
  {
    "Code": "AAA",
    "Date": "/Date(1481875200000)/",
    "Value": 12345.00
  }
]

这很容易被 Newtonsoft Json 反序列化。但是我似乎无法使用 Python 内置的 Json 解码器来反序列化它

from django.db import models

class ItemModel(models.Model):
    code = models.CharField(max_length=5)
    date = models.DateTimeField()
    value = models.IntegerField(default=0)

import json

parsed_data = json.loads(json_data, encoding='utf-8')
new_model=ItemModel()
new_model.code = parsed_data["Code"]
new_model.date = parsed_data["Date"]
new_model.value = parsed_data["Value"]
new_model.save()

给了

ValidationError: [u"'/Date(1481875200000)/' 值无效 格式。必须是 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] 格式。"]

编辑:现在我知道这是因为将字符串分配给日期时间字段

有没有办法尝试将这些数据解析为 django 模型? - 因为我无法修改 json 响应。这也是正确的方法吗?因为代码在我看来直觉上是不确定的。

【问题讨论】:

  • 当我尝试这样做时,它只是将"/Date(1481875200000)/" 解析为一个字符串,并且从不尝试进行任何日期解析(正如人们所期望的那样,JSON 没有日期数据类型)。所以你正在做一些你没有在这里展示的额外事情。
  • 嗯,有道理,我实际上是在尝试将此字段设置为 Django 模型 DateTime 字段,所以这可能是由为其设置字符串引起的。我将编辑问题。

标签: python json django date


【解决方案1】:

您需要为“日期”字段实现自定义解码器。

import json
from datetime import datetime

def parseMyData(dct):
    if 'Date' in dct:
        timestamp = int(dct['Date'][6:-2])
        dct['Date'] = datetime.fromtimestamp(timestamp)
    return dct


jdata = '''{
"Code": "AAA",
"Date": "/Date(14818752000)/",
"Value": 12345.00
}
'''

json.loads(jdata,  object_hook=parseMyData)

然后返回

{u'Code': u'AAA',
 'Date': datetime.datetime(2439, 8, 3, 10, 0),
 u'Value': 12345.0}

【讨论】:

  • 此代码需要稍作修改,因为我的 json 中的时间戳以毫秒为单位,因此应改为 int(dct['Date'][6:-2]) / 1000。我不知道我是否应该担心 int 受到限制 - 这不应该以长(Int64)格式存储吗?无论如何,这仍然有效。谢谢!
  • 不限。在python中,如果'plain integer'太大,它会自动转换为'long integer'
猜你喜欢
  • 2020-06-11
  • 1970-01-01
  • 2021-03-07
  • 2012-06-09
  • 1970-01-01
  • 2011-09-17
  • 2016-12-29
  • 2011-09-12
  • 1970-01-01
相关资源
最近更新 更多