7

My original dictionary is

A = {                                                                                                  
    'date': datetime.date(2013, 1, 1),
    'price': 100
}

Since datetime.date is not serializable, I add a default function to deal with that:

B = json.dumps(A, default=lambda obj:obj.isoformat() if hasattr(obj, 'isoformat') else obj)

My question is, how can I deserialize the 'date' field while I use json.loads to convert it back to the original dictionary?

waitingkuo
  • 89,478
  • 28
  • 112
  • 118

3 Answers3

11
from datetime import datetime

def load_with_datetime(pairs, format='%Y-%m-%d'):
    """Load with dates"""
    d = {}
    for k, v in pairs:
        if isinstance(v, basestring):
            try:
                d[k] = datetime.strptime(v, format).date()
            except ValueError:
                d[k] = v
        else:
            d[k] = v             
    return d

dump = json.dumps(A, default = f)
json.loads(dump, object_pairs_hook=load_with_datetime)

# {u'date': datetime.date(2013, 1, 1), u'price': 100}
root
  • 76,608
  • 25
  • 108
  • 120
  • as a personal preference, i check for a regex instead of the try/except block. but i have object_pairs_hooks that handle multiple formats and require that. – Jonathan Vanasco Feb 21 '13 at 06:52
  • @JonathanVanasco -- Yup, if you have multiple formats, then using a regex could be an alternative, also I would look at the `dateutil` parser... – root Feb 21 '13 at 06:57
3

continue to your example code,

C = json.loads(B)
C['date'] = datetime.datetime.strptime(C['date'], '%Y-%m-%d')
print C
# {u'date': datetime.datetime(2013, 1, 1, 0, 0), u'price': 100}
Chunliang Lyu
  • 1,750
  • 1
  • 20
  • 34
0

Use pickle module

    import pickle
    fileop = open("timeformat.txt","wb")
    pickle.dump(A,fileop)
    fileop.close()
    print pickle.load(open("timeformat.txt","rb"))
    print A['Date']


    >>>{'date': datetime.date(2013, 1, 1), 'price': 100}
    >>>2013-01-01
vaibhav1312
  • 863
  • 4
  • 13
  • 31