• Stars
    star
    302
  • Rank 138,030 (Top 3 %)
  • Language
    Python
  • License
    The Unlicense
  • Created over 13 years ago
  • Updated almost 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Convert JSON to a UNIX-friendly line-based format.

jsonpipe

Everyone I know prefers to work with JSON over XML, but sadly there is a sore lack of utilities of the quality or depth of html-xml-utils and XMLStarlet for actually processing JSON data in an automated fashion, short of writing an ad hoc processor in your favourite programming language.

jsonpipe is a step towards a solution: it traverses a JSON object and produces a simple, line-based textual format which can be processed by all your UNIX favourites like grep, sed, awk, cut and diff. It may also be valuable within programming languages---in fact, it was originally conceived as a way of writing simple test assertions against JSON output without coupling the tests too closely to the specific structure used.

This implementation (which should be considered the reference) is written in Python.

Example

A <pre> is worth a thousand words. For simple JSON values:

$ echo '"Hello, World!"' | jsonpipe
/   "Hello, World!"
$ echo 123 | jsonpipe
/   123
$ echo 0.25 | jsonpipe
/   0.25
$ echo null | jsonpipe
/   null
$ echo true | jsonpipe
/   true
$ echo false | jsonpipe
/   false

The 'root' of the object tree is represented by a single / character, and for simple values it doesn't get any more complex than the above. Note that a single tab character separates the path on the left from the literal value on the right.

Composite data structures use a hierarchical syntax, where individual keys/indices are children of the path to the containing object:

$ echo '{"a": 1, "b": 2}' | jsonpipe
/   {}
/a  1
/b  2
$ echo '["foo", "bar", "baz"]' | jsonpipe
/   []
/0  "foo"
/1  "bar"
/2  "baz"

For an object or array, the right-hand column indicates the datatype, and will be either {} (object) or [] (array). For objects, the order of the keys is preserved in the output.

The path syntax allows arbitrarily complex data structures:

$ echo '[{"a": [{"b": {"c": ["foo"]}}]}]' | jsonpipe
/   []
/0  {}
/0/a        []
/0/a/0      {}
/0/a/0/b    {}
/0/a/0/b/c  []
/0/a/0/b/c/0        "foo"

Caveat: Path Separators

Because the path components are separated by / characters, an object key like "abc/def" would result in ambiguous output. jsonpipe will throw an error if this occurs in your input, so that you can recognize and handle the issue. To mitigate the problem, you can choose a different path separator:

$ echo '{"abc/def": 123}' | jsonpipe -s '☃'
☃   {}
☃abc/def    123

The Unicode snowman is chosen here because it's unlikely to occur as part of the key in most JSON objects, but any character or string (e.g. :, ::, ~) will do.

jsonunpipe

Another useful part of the library is jsonunpipe, which turns jsonpipe output back into JSON proper:

$ echo '{"a": 1, "b": 2}' | jsonpipe | jsonunpipe
{"a": 1, "b": 2}

jsonunpipe also supports incomplete information (such as you might get from grep), and will assume all previously-undeclared parts of a path to be JSON objects:

$ echo "/a/b/c      123" | jsonunpipe
{"a": {"b": {"c": 123}}}

Python API

Since jsonpipe is written in Python, you can import it and use it without having to spawn another process:

>>> from jsonpipe import jsonpipe
>>> for line in jsonpipe({"a": 1, "b": 2}):
...     print line
/   {}
/a  1
/b  2

Note that the jsonpipe() generator function takes a Python object, not a JSON string, so the order of dictionary keys may be slightly unpredictable in the output. You can use simplejson.OrderedDict to get a fixed ordering:

>>> from simplejson import OrderedDict
>>> obj = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> obj
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> for line in jsonpipe(obj):
...     print line
/   {}
/a  1
/b  2
/c  3

A more general hint: if you need to parse JSON but maintain ordering for object keys, use the object_pairs_hook option on simplejson.load(s):

>>> import simplejson
>>> simplejson.loads('{"a": 1, "b": 2, "c": 3}',
...                  object_pairs_hook=simplejson.OrderedDict)
OrderedDict([('a', 1), ('b', 2), ('c', 3)])

Of course, a Python implementation of jsonunpipe also exists:

>>> from jsonpipe import jsonunpipe
>>> jsonunpipe(['/\t{}', '/a\t123'])
{'a': 123}

You can pass a decoder parameter, as in the following example, where the JSON object returned uses an ordered dictionary:

>>> jsonunpipe(['/\t{}', '/a\t123', '/b\t456'],
...            decoder=simplejson.JSONDecoder(
...                object_pairs_hook=simplejson.OrderedDict))
OrderedDict([('a', 123), ('b', 456)])

Installation

jsonpipe is written in Python, so is best installed using pip:

pip install jsonpipe

Note that it requires Python v2.5 or later (simplejson only supports 2.5+).

(Un)license

This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.

In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org/>

More Repositories

1

humanhash

Human-readable digests.
Python
852
star
2

markdoc

A lightweight Markdown-based wiki system. Current status: abandoned.
Python
347
star
3

zmqc

netcat for ØMQ. Small but powerful.
Python
256
star
4

urlobject

Python library for manipulating URLs (and some URIs) in a more natural way.
Python
188
star
5

django-postgres

First-class Postgres feature support for the Django ORM.
Python
184
star
6

dagny

Rails-style Resource-Oriented Architecture for Django.
Python
158
star
7

django-conch

Expose the Django shell as an SSH server.
Python
147
star
8

cssmin

*NO LONGER MAINTAINED*. A Python port of the YUI CSS compression algorithm.
Python
133
star
9

teena

Python ports of useful syscalls, using asynchronous I/O.
Python
110
star
10

zenqueue

An incredibly simple (but fast) network message queueing system, written in Python.
Python
66
star
11

django-castor

A content-addressable storage backend for Django.
Python
56
star
12

django-qmethod

Easily define methods over collections of Django models.
Python
54
star
13

django-boss

Simpler Django management commands, powered by argparse.
Python
54
star
14

gevent-psycopg2

Obsolete; use https://bitbucket.org/dvarrazzo/psycogreen/ instead.
Python
51
star
15

django-qmixin

A Django app for extending managers and the querysets they produce.
Python
42
star
16

django-exceptional

A Django client for Exceptional (getexceptional.com)
Python
42
star
17

rkquery

jQuery for Riak, in Python.
Python
31
star
18

uptheasset

[OBSOLETE] Double-entry bookkeeping and accounting, powered by RDF.rb and UNIX.
Ruby
30
star
19

slugify

A generic slugifier (currently only for Latin-based scripts).
Python
29
star
20

django-clsview

Yet another class-based view system for Django.
Python
25
star
21

websession

Information on WebSession, a proposed protocol for secure session maintenance on the Web
JavaScript
21
star
22

gevent-threading-comparison

An experiment to compare the performances of gevent and threading.
Python
17
star
23

calabash

Bash-style pipelining for Python generators.
Python
17
star
24

pdiffer

A Python interface to the PerceptualDiff tool.
Python
16
star
25

django-qmanager

Create managers for Django models based on pre-defined queries.
Python
15
star
26

daterange

Python utility like xrange(), but for datetime objects.
Python
13
star
27

python-csiphash

The SipHash-2-4 C reference implementation, CFFI-wrapped for Python
Python
12
star
28

amoebajs

A WebAssembly-based linear constraint solver for JavaScript
JavaScript
12
star
29

gevent-selfpipe

Hack to run blocking calls whilst maintaining gevent-based synchronization.
Python
12
star
30

urecord

A structured record metaclass for Python.
Python
12
star
31

django-zskel-project

Zack’s Skeleton Django Project.
Python
11
star
32

glyphicons-splitter

Produce individual SVGs and PDFs of the Glyphicons.
Python
10
star
33

django-retracer

Store and restore old locations in Django.
Python
10
star
34

zrpc

ZeroMQ-based JSON-RPC in Python.
Python
9
star
35

pathobject

An update of Jason Orendorff’s path.py.
Python
9
star
36

pyhoudini

Houdini bindings for Python (c.f. https://github.com/vmg/houdini)
9
star
37

relations

A tiny relational algebra engine for Python.
Python
7
star
38

django-cssmin

Easy CSS compression for Django.
Python
6
star
39

strscan

A simple string scanner class for Python. Useful for building lexers/tokenizers by hand.
Python
6
star
40

flask-resource

Build resource-oriented Web apps with Flask.
Python
6
star
41

blog.zacharyvoase.com

Zachary Voase’s nanoc3-powered blog.
Ruby
5
star
42

bossy

Write commands in Python, run them from the shell.
Python
4
star
43

python-crbtree

SortedDict and SortedSet implementations backed by a red-black tree, written in C.
C
4
star
44

python-recordinality

An implementation of the Recordinality sketch in Python, with a CLI
Python
4
star
45

exchequer

Easy table formatting in Python and on the command-line.
Python
4
star
46

django-jsmin

Easy JavaScript minification for Django.
JavaScript
4
star
47

djanjinja

Seamless Jinja2 integration with Django.
Python
3
star
48

broker

Python function dispatching based on MIME types and Accept headers.
Python
3
star
49

pistachio

An experimental Mustache implementation in Python.
Python
3
star
50

logbook-zmqpush

Python
2
star
51

croaring.py

Fast integer sets for Python, based on Roaring Bitmaps and CFFI
Python
2
star
52

llvmbc-wasm-loader

Webpack loader which converts LLVM bytecode to WASM using Emscripten
JavaScript
2
star
53

curly

Use the curl command line interface from Python with minimal fuss.
Python
2
star
54

swipecheck

SwipeCheck: Check into Foursquare using RFID/Twilio.
Python
2
star
55

metaspace

Create Python sub-modules using class syntax.
Python
2
star
56

python-cskipdict

A CFFI-based SkipDict implementation for Python.
C++
2
star
57

logbook-gevent

Experimental support for greenlet-based contexts in Logbook.
Python
2
star
58

skeleton.rb

A skeleton for Ruby projects (using Rake, RSpec, YARD and Bundler)
Ruby
2
star
59

compass-tfg-plugin

A Compass-compatible Sass port of the Tiny Fluid Grid system, plus extras.
Ruby
2
star
60

lovedb

The LoveDB spec.
1
star
61

word2vec

Automatically exported from code.google.com/p/word2vec
C
1
star
62

zacharyvoase.com

The nanoc-powered source of zacharyvoase.com.
PHP
1
star
63

assert_changes

Test assertions about changes in monitored values.
Python
1
star
64

hotqueue

HotQueue is a Python library that allows you to use Redis as a message queue within your Python programs.
Python
1
star
65

django-migrationbug-poc

A proof-of-concept for a bug in Django v1.8 migrations
Python
1
star
66

Adelie

The Ghost theme which powers my blog at zacharyvoase.com
CSS
1
star
67

jpipe

Manipulate JSON at the command-line easily with this line-based formatter
Go
1
star
68

try

A Try monad for Java 8
Java
1
star
69

tipsum

Lorem ipsum using the testing-in-python archive as the text corpus for a Markov chain
Python
1
star
70

stitch-test

Created with StackBlitz ⚡️
TypeScript
1
star
71

czmqc

zmqc, re-implemented in portable C.
C
1
star
72

logbook-zmqcentral

Centralized ZMQ_PUB/SUB-based logging for Logbook.
1
star
73

ninja-builder

JS/Typescript utility for building ninja build files programmatically.
TypeScript
1
star