def collapse_json(text, indent=8):
    """Compacts a string of json data by collapsing whitespace after the specified
    indent level
    
    NOTE: will not produce correct results when indent level is not a multiple
    of the json indent level
    """
    initial = " " * indent
    out = []  # final json output
    sublevel = []  # accumulation list for sublevel entries
    pending = None  # holder for consecutive entries at exact indent level
    for line in text.splitlines():
        if line.startswith(initial):
            if line[indent] == " ":
                # found a line indented further than the indent level, so add
                # it to the sublevel list
                if pending:
                    # the first item in the sublevel will be the pending item
                    # that was the previous line in the json
                    sublevel.append(pending)
                    pending = None
                item = line.strip()
                sublevel.append(item)
                if item.endswith(","):
                    sublevel.append(" ")
            elif sublevel:
                # found a line at the exact indent level *and* we have sublevel
                # items. This means the sublevel items have come to an end
                sublevel.append(line.strip())
                out.append("".join(sublevel))
                sublevel = []
            else:
                # found a line at the exact indent level but no items indented
                # further, so possibly start a new sub-level
                if pending:
                    # if there is already a pending item, it means that
                    # consecutive entries in the json had the exact same
                    # indentation and that last pending item was not the start
                    # of a new sublevel.
                    out.append(pending)
                pending = line.rstrip()
        else:
            if pending:
                # it's possible that an item will be pending but not added to
                # the output yet, so make sure it's not forgotten.
                out.append(pending)
                pending = None
            if sublevel:
                out.append("".join(sublevel))
            out.append(line)
    return "\n".join(out)


def dict_to_list(d):
    """Return a sorted list of lists that represent the dictionary.

    Only strings are allowed as keys in a json dictionary, so this transform
    the dictionary into a list of lists that can be serialized in as small
    amount of text as possible. Tuples would be more efficient in python terms,
    but json can't serialize tuples directly either.
    """
    return sorted([list(i) for i in d.iteritems()])


if __name__ == "__main__":
    import json

    s = {"zero": ["first", {"second": 2, "third": 3, "fourth": 4, "items": [[1,2,3,4], [5,6,7,8], 9, 10, [11, [12, [13, [14, 15]]]]]}]}

    text = json.dumps(s, indent=4)

    for level in range(0, 21, 4):
        processed = collapse_json(text, indent=level)
        print level
        print processed
        rebuilt = json.loads(processed)
        assert rebuilt == s
