view python/jsonex.py @ 842:03f9657514e9

while we might not want Octave *that* much, we will never want OCAML
author Jeff Hammel <k0scist@gmail.com>
date Sun, 09 Jul 2017 15:01:16 -0700
parents 0fa456446fea
children
line wrap: on
line source

#!/usr/bin/env python

"""
JSON explorer
"""

import argparse
import json
import os
import sys
import urllib2

def dereference(obj, key):
    if obj is None:
        return None
    if isinstance(obj, dict):
        return obj[key]
    return obj[int(key)]

def main(args=sys.argv[1:]):

    # command line
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('input', nargs='?',
                        help="input file or url (read from stdin if ommitted)")
    parser.add_argument('object', nargs='*',
                        help="object in dotted notation")

    options = parser.parse_args(args)

    # get data
    if not options.input or options.input == '-':
        data = sys.stdin
    elif'://' in options.input:
        data = urllib2.urlopen(options.input)
    else:
        data = open(options.input, 'r')
    obj = json.load(data)

    if options.object:
        for o in options.object:
            base = obj
            for key in o.strip().split('.'): # split into objects
                base = dereference(base, key)
                if base is None:
                   break
            print (json.dumps(base))
    else:
        print (json.dumps(obj, indent=2, sort_keys=True))

if __name__ == '__main__':
    main()