2017-03-02 94 views
1

我想将一个web爬行器应用程序从.Net移植到Python。它收到类似于以下的json响应:反序列化JSON在Python/Django中的日期字段

[ 
    { 
    "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)/' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]

编辑:现在我知道这是因为一个日期时间字段

指定的字符串引起的

有没有办法尝试解析这个数据到Django模型? - 因为我无法修改json响应。这是做这个的正确方法吗?因为代码似乎直观地适合于我。

+2

当我尝试,它只是解析'“/日期(1481875200000)/”'作为一个字符串,从来没有试图做任何日期解析(正如人们所期望的那样, JSON没有日期数据类型)。所以你正在做一些额外的事情,你不在这里展示。 – RemcoGerlich

+0

嗯有道理,我实际上是试图将此字段设置为Django模型DateTime字段,所以这可能是由设置字符串引起的。我将编辑该问题。 – Sloth

回答

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} 
+0

这段代码需要稍加修改,因为我的json中的时间戳是以毫秒为单位的,所以它应该是int(dct ['Date'] [6:-2])/ 1000。我不知道我是否应该关注int是否受限 - 不应该将它存储为长(Int64)格式吗?无论如何,这仍然有效。谢谢! – Sloth

+0

它不受限制。在Python中,如果“整数”太大,它会自动转换为“长整数” – valentin

相关问题