#!/usr/bin/env python # Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import argparse import json import os import sys def GetFormattedJSONString(file_path): with open(file_path, 'r') as f: json_obj = json.load(f) file_content = f.read() return json.dumps( json_obj, indent=2, sort_keys=True, separators=(',', ': ')) def ValidateJSONFormat(file_path): with open(file_path, 'r') as f: file_content = f.read() if file_content != GetFormattedJSONString(file_path): raise Exception( 'Reformat your JSON file by running: %s --format %s' % (__file__, file_path)) print >> sys.stdout, ('%s passes the JSON format validation' % file_path) def Format(file_path): formatted_JSON_string = GetFormattedJSONString(file_path) with open(file_path, 'w') as f: f.write(formatted_JSON_string) def Main(args): description = """A JSON formatting tool. This is a tool that validate and reformats JSON file so that it complies with a certain style. The JSON style imposed by this tool is: * JSON array elements and object members are indented with 2 spaces. * Dictionaries objects are sorted by key. * Items are sperated by ', ' and ': '. """ parser = argparse.ArgumentParser( description=description, formatter_class=argparse.RawTextHelpFormatter) parser.add_argument('file_path', type=str, help='The path to JSON file.') parser.add_argument('--format', action='store_true', default=False, help='Format the JSON file.') options = parser.parse_args(args) if options.format: Format(options.file_path) return 0 ValidateJSONFormat(options.file_path) return 0 if __name__ == '__main__': sys.exit(Main(sys.argv[1:]))