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 commented May 6, 2016

I wrote a blog post how to use this:


This comment has been minimized.

Copy link

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 commented Jan 23, 2017

@Rolinh should work fine on python3


This comment has been minimized.

Copy link

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
You can’t perform that action at this time.