1 #!/usr/bin/env python 2 # Copyright 2015 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 import argparse 6 import json 7 import os 8 import sys 9 10 11 def GetFormattedJSONString(file_path): 12 with open(file_path, 'r') as f: 13 json_obj = json.load(f) 14 file_content = f.read() 15 return json.dumps( 16 json_obj, indent=2, sort_keys=True, separators=(',', ': ')) 17 18 19 def ValidateJSONFormat(file_path): 20 with open(file_path, 'r') as f: 21 file_content = f.read() 22 if file_content != GetFormattedJSONString(file_path): 23 raise Exception( 24 'Reformat your JSON file by running: %s --format %s' % 25 (__file__, file_path)) 26 print >> sys.stdout, ('%s passes the JSON format validation' % file_path) 27 28 29 def Format(file_path): 30 formatted_JSON_string = GetFormattedJSONString(file_path) 31 with open(file_path, 'w') as f: 32 f.write(formatted_JSON_string) 33 34 35 def Main(args): 36 description = """A JSON formatting tool. 37 38 This is a tool that validate and reformats JSON file so that it complies with 39 a certain style. The JSON style imposed by this tool is: 40 * JSON array elements and object members are indented with 2 spaces. 41 * Dictionaries objects are sorted by key. 42 * Items are sperated by ', ' and ': '. 43 """ 44 parser = argparse.ArgumentParser( 45 description=description, formatter_class=argparse.RawTextHelpFormatter) 46 parser.add_argument('file_path', type=str, help='The path to JSON file.') 47 parser.add_argument('--format', action='store_true', default=False, 48 help='Format the JSON file.') 49 options = parser.parse_args(args) 50 if options.format: 51 Format(options.file_path) 52 return 0 53 ValidateJSONFormat(options.file_path) 54 return 0 55 56 57 if __name__ == '__main__': 58 sys.exit(Main(sys.argv[1:])) 59