diff --git a/airflow/utils.py b/airflow/utils.py index 09e086ab5dd97..0f74532e355a9 100644 --- a/airflow/utils.py +++ b/airflow/utils.py @@ -2,7 +2,7 @@ from builtins import str, input, object from past.builtins import basestring from copy import copy -from datetime import datetime, timedelta +from datetime import datetime, date, timedelta from dateutil.relativedelta import relativedelta # for doctest from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart @@ -29,6 +29,8 @@ from sqlalchemy import event, exc from sqlalchemy.pool import Pool +import numpy as np + from airflow import settings from airflow.configuration import conf @@ -621,9 +623,20 @@ def chain(*tasks): class AirflowJsonEncoder(json.JSONEncoder): def default(self, obj): + # convert dates and numpy objects in a json serializable format if isinstance(obj, datetime): return obj.strftime('%Y-%m-%dT%H:%M:%SZ') elif isinstance(obj, date): return obj.strftime('%Y-%m-%d') + elif type(obj) in [np.int_, np.intc, np.intp, np.int8, np.int16, + np.int32, np.int64, np.uint8, np.uint16, + np.uint32, np.uint64]: + return int(obj) + elif type(obj) in [np.bool_]: + return bool(obj) + elif type(obj) in [np.float_, np.float16, np.float32, np.float64, + np.complex_, np.complex64, np.complex128]: + return float(obj) + # Let the base class default method raise the TypeError return json.JSONEncoder.default(self, obj)