Allow setting a default JSON Encoder and JSON Decoder
Is your feature request related to a problem? Please describe.
I'm using graphene_django, which auto-converts model fields to JSONString, which doesn't allow customizing the JSONEncoder class. I'm doing this for some semi-hacky code where I just want to store a big blob-o-stuff, using a custom encoder to convert enums and datetimes.
PS - I'm happy to implement this! Just looking for feedback on what are reasonable modifications to API for this (if any) or if I should give up on this thread :)
Describe the solution you'd like Allow me to specify a custom JSON encoder via some setting or a global.
Describe alternatives you've considered
- In my ideal world, I'd be able to pass custom encoders to specific JSON fields. (realistically, you can always merge all the JSONEncoders, so being able to specify just one is fine).
-
serialize()no longer a static method (seems like overkill for small change) - Make graphene-django create custom JSONString fields based upon jsonencoder / decoder (possible, slightly more goofy perhaps)
Additional context
I was running into a similar issue with the common TypeError: Object of type datetime is not JSON serializable error.
Currently, I deal with it by creating a Custom Scalar:
# subclass JSONEncoder
class DateTimeEncoder(JSONEncoder):
"""
Reference --> https://pynative.com/python-serialize-datetime-into-json/
"""
#Override the default method
def default(self, obj):
if isinstance(obj, (datetime.date, datetime.datetime)):
return obj.isoformat()
class CustomJSONString(graphene.JSONString):
"""
Allows use of a JSON String for input / output from the GraphQL schema.
Use of this type is *not recommended* as you lose the benefits of having a defined, static
schema (one of the key benefits of GraphQL).
"""
@staticmethod
def serialize(dt):
return json.dumps(dt, cls=DateTimeEncoder)
I am not using graphene_django so please ignore if this is not relevant.