2017-03-02 4 views
1

Ich versuche, eine Web-Crawler-Anwendung von .NET nach Python zu portieren. Er empfängt json Antworten ähnlich der folgenden:Deserialisieren von JSON-Datumsfeld in Python/Django

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

Dieses leicht von Newtonsoft Json deserialisiert werden konnte. Allerdings kann ich nicht scheinen dies deserialisieren mit Python gebaut in Json Decoder

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() 

die

ValidationError: [u"'/Date(1481875200000)/' value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format."]

bearbeiten gibt: Jetzt weiß ich, das einen String in einem Date-Time-Feld verursacht, weil der Zuordnung

Gibt es eine Möglichkeit, diese Daten mit dem Django-Modell zu analysieren? - Da ich keine Möglichkeit habe, die JSON-Antwort zu ändern. Ist dies auch der richtige Weg? wie der Code mir gegenüber intuitiv zu sein scheint.

+2

Wenn ich versuche, dass es parst einfach ' "/ Date (1481875200000) /"' als String und nie Parsen ein beliebiges Datum zu tun versucht (wie man erwarten würde, JSON hat keinen Datums-Datentyp. Also machst du etwas extra, was du hier nicht zeigst. – RemcoGerlich

+0

Hmm macht Sinn, ich habe tatsächlich versucht, dieses Feld zu einem Django-Modell DateTime-Feld zu setzen, so dass dies wahrscheinlich durch Festlegen einer Zeichenfolge darauf verursacht wird. Ich werde die Frage bearbeiten. – Sloth

Antwort

1

Sie müssen einen benutzerdefinierten Decoder für das Feld "Datum" implementieren.

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) 

und gibt

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

Dieser Code muss leicht modifiziert werden, da der Zeitstempel in meinem JSON in Millisekunden liegt, also sollte stattdessen int (dct ['Date'] [6: -2])/1000 sein. Ich weiß nicht, ob ich darüber besorgt sein sollte, dass ich nicht begrenzt bin - sollte das nicht stattdessen in einem langen (Int64) Format gespeichert werden? Wie auch immer, das funktioniert immer noch. Vielen Dank! – Sloth

+0

Es ist nicht begrenzt. In Python wird eine 'Ganzzahl' automatisch in eine 'Lange Ganzzahl' umgewandelt, wenn sie zu groß ist – valentin