Last active
February 18, 2021 18:37
-
-
Save johtso/5881137 to your computer and use it in GitHub Desktop.
Django Rest Framework underscore <-> camelcase conversion
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
from rest_framework import serializers, renderers, parsers | |
class JSONRenderer(renderers.JSONRenderer): | |
def render(self, data, *args, **kwargs): | |
if data: | |
data = recursive_key_map(underscore_to_camelcase, data) | |
return super(JSONRenderer, self).render(data, *args, **kwargs) | |
class JSONParser(parsers.JSONParser): | |
def parse(self, *args, **kwargs): | |
obj = super(JSONParser, self).parse(*args, **kwargs) | |
return recursive_key_map(camelcase_to_underscore, obj) | |
def underscore_to_camelcase(word, lower_first=True): | |
result = ''.join(char.capitalize() for char in word.split('_')) | |
if lower_first: | |
return result[0].lower() + result[1:] | |
else: | |
return result | |
_first_cap_re = re.compile('(.)([A-Z][a-z]+)') | |
_all_cap_re = re.compile('([a-z0-9])([A-Z])') | |
# http://stackoverflow.com/a/1176023 | |
def camelcase_to_underscore(word): | |
s1 = _first_cap_re.sub(r'\1_\2', word) | |
return _all_cap_re.sub(r'\1_\2', s1).lower() | |
def recursive_key_map(function, obj): | |
if isinstance(obj, dict): | |
new_dict = {} | |
for key, value in obj.iteritems(): | |
if isinstance(key, basestring): | |
key = function(key) | |
new_dict[key] = recursive_key_map(function, value) | |
return new_dict | |
if hasattr(obj, '__iter__'): | |
return [recursive_key_map(function, value) for value in obj] | |
else: | |
return obj |
Just fixed an issue with it choking on non-string keys. Not sure if it's Unicode friendly at the moment, need to pipe some through it and see where it breaks.
brilliant!
nice one!
from django.utils.text import re_camel_case
def camel_case_to_underscore(value):
"""
Splits CamelCase and converts to lower case with underscores.
"""
return re_camel_case.sub(r'_\1', value).strip('_').lower()
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
neat 😄