Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Restore JSON hierarchy in Weblate PRE_COMMIT_SCRIPTS
#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
import argparse
import codecs
import json
__author__ = 'Daniel Widerin <>'
__license__ = 'MIT'
class HierarchicalDict(dict):
def __init__(self, *args, **kwargs):
self.update(*args, **kwargs)
def __setitem__(self, key, val):
dict.__setitem__(self, key, val)
def update(self, *args, **kwargs):
for key, val in dict(*args, **kwargs).items():
keys = key.split('.')
if len(keys) > 1:
self._decode(keys, val)
self[key] = val
def _decode(self, keys, value):
storage = self
for key0 in keys[:-1]:
if key not in storage:
storage[key] = {}
storage = storage[key]
storage[keys[-1]] = value
def main():
parser = argparse.ArgumentParser(
description='Recover flattened json file.')
'files', metavar='FILE', type=str, nargs='+',
help='Files to process')
'--indent', default=4, type=int, dest='indent',
help='json indentation for outfile')
args = parser.parse_args()
for filename in args.files:
raw =, 'r', encoding='utf-8').read()
data = json.loads(raw, object_pairs_hook=HierarchicalDict)
with, 'w', encoding='utf-8') as outfile:
json.dump(data, outfile,
except Exception as ex:
print('Error processing {0:s}'.format(filename), ex)
if __name__ == '__main__':

This comment has been minimized.

Copy link
Owner Author

@saily saily commented May 6, 2016

I wrote a blog post how to use this:


This comment has been minimized.

Copy link

@rolinh rolinh commented Oct 21, 2016

Thanks for this script!

What about changing this line:

#!/usr/bin/env python2.7


#!/usr/bin/env python

And using 2to3 to make it possible to run it on either version of python?


This comment has been minimized.

Copy link
Owner Author

@saily saily commented Jan 23, 2017

@rolinh should work fine on python3


This comment has been minimized.

Copy link

@cescp cescp commented Jun 21, 2017

Thanks for the script!
But line 30 should be:
for key in keys[:-1]:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment