12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #!/usr/bin/python
- # Consolidates duplicate key-value pairs in a JSON file.
- # If the same key is used with different values, no warning is given,
- # and there is no guarantee about which key-value pair will be output.
- # There is also no guarantee as to the order of the key-value pairs
- # output.
- #
- # Copyright 2013 Google Inc.
- # https://developers.google.com/blockly/
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- import argparse
- import codecs
- import json
- from common import InputError
- def main():
- """Parses arguments and iterates over files.
- Raises:
- IOError: An I/O error occurred with an input or output file.
- InputError: Input JSON could not be parsed.
- """
- # Set up argument parser.
- parser = argparse.ArgumentParser(
- description='Removes duplicate key-value pairs from JSON files.')
- parser.add_argument('--suffix', default='',
- help='optional suffix for output files; '
- 'if empty, files will be changed in place')
- parser.add_argument('files', nargs='+', help='input files')
- args = parser.parse_args()
- # Iterate over files.
- for filename in args.files:
- # Read in json using Python libraries. This eliminates duplicates.
- print('Processing ' + filename + '...')
- try:
- with codecs.open(filename, 'r', 'utf-8') as infile:
- j = json.load(infile)
- except ValueError, e:
- print('Error reading ' + filename)
- raise InputError(file, str(e))
- # Built up output strings as an array to make output of delimiters easier.
- output = []
- for key in j:
- if key != '@metadata':
- output.append('\t"' + key + '": "' +
- j[key].replace('\n', '\\n') + '"')
- # Output results.
- with codecs.open(filename + args.suffix, 'w', 'utf-8') as outfile:
- outfile.write('{\n')
- outfile.write(',\n'.join(output))
- outfile.write('\n}\n')
- if __name__ == '__main__':
- main()
|