This is a Python implementation of Tabular-JSON, a superset of JSON adding CSV-like tables.
Install via PyPI: https://pypi.org/project/tabularjson/
pip install tabularjson
from tabularjson import parse, stringify, StringifyOptions
text = """{
"id": 1,
"name": "Brandon",
"friends": ---
"id", "name"
2, "Joe"
3, "Sarah"
---
}
"""
data = parse(text)
print(data)
# {
# 'id': 1,
# 'name': 'Brandon',
# 'friends': [
# {'id': 2, 'name': 'Joe'},
# {'id': 3, 'name': 'Sarah'}
# ]
# }
data["friends"].append({"id": 4, "name": "Alan"})
options: StringifyOptions = {"indentation": 4, "trailing_commas": False}
updatedText = stringify(data, options)
print(updatedText)
# {
# "id": 1,
# "name": "Brandon",
# "friends": ---
# "id", "name"
# 2, "Joe"
# 3, "Sarah"
# 4, "Alan"
# ---
# }Parse a string containing Tabular-JSON data into JSON.
Syntax:
data = parse(text)
Where:
textis a string containing Tabular-JSON datadatais the parsed data, returned by the function
Example:
from tabularjson import parse
text = """{
"id": 1,
"name": "Brandon",
"friends": ---
"id", "name"
2, "Joe"
3, "Sarah"
---
}
"""
data = parse(text)
print(data)
# {
# 'id': 1,
# 'name': 'Brandon',
# 'friends': [
# {'id': 2, 'name': 'Joe'},
# {'id': 3, 'name': 'Sarah'}
# ]
# }Stringify data into a string containing Tabular-JSON.
Syntax:
text = stringify(data, options)
Where:
datais a JSON object or arrayoptionsis an optional object which can have the following properties:indentation: int | str | Nonean integer specifying the number of spaces in the indentation, or a string containing the indentation itself, like"\t"to get tab indentation. WhenNone(default), the output will not be indented.trailing_commas: boolwhen true, the output will contain trailing commas after the last item in an array and the last key/value pair in an object.Falseby default.output_as_table: Callable[[TabularData[T]], bool]a callback specifying whether to an array containing tabular data as table or not. This option is explained in detail in the section Output as table below.
textis a string containing Tabular-JSON data, returned by the function
Example:
from tabularjson import stringify, StringifyOptions
data = {
"id": 1,
"name": "Brandon",
"friends": [
{"id": 2, "name": "Joe"},
{"id": 3, "name": "Sarah"}
]
}
options: StringifyOptions = {"indentation": 4, "trailing_commas": False}
text = stringify(data, options)
print(text)
# {
# "id": 1,
# "name": "Brandon",
# "friends": ---
# "id", "name"
# 2, "Joe"
# 3, "Sarah"
# ---
# }Data is tabular when it is an array containing at least one item, where every item is an object. Stringifying tabular data as a table normally results in the smallest output, but it is not always the most readable way. For example having nested tables inside a table is not very readable. Also, having a table containing a field like "comments" or "description" which contains long texts results in a very wide column, making the formatted table hard to read.
Depending on your use case, you can configure a strategy for when to output tabular data as a table. This can be done using the option output_as_table. The lambda function output_as_table is invoked for all tabular data in the input json and returns true when the data should be stringified as a table.
The library comes with a number of built-in utility functions that can be used with output_as_table:
always(tabular_data): always serialize tabular data as a table, also when the data contains nested arrays. This is the default value of optionoutput_as_table.no_nested_arrays(tabular_data): serialize tabular data as a table when the data does not contain nested arrays.no_nested_tables(tabular_data): serialize tabular data as a table when the data does not contain nested tables. Allows nested arrays when the contain primitive values like numbers or strings.is_homogeneous(tabular_data): serialize tabular data as a table when the structure is homogeneous, that is every item has the exact same keys and nested keys.no_long_strings(tabular_data [, max_length]): serialize tabular data as a table when the data does not contain long text fields
Usage example:
from tabularjson import stringify, is_homogeneous, StringifyOptions
data = {
"careTakers": [
{"id": 1001, "name": "Joe"},
{"id": 1002, "name": "Sarah"}
],
"animals": [
{
"animalId": 1,
"name": "Elephant",
"description": "Elephants are the largest living land animals.",
},
{
"animalId": 2,
"name": "Giraffe"
},
],
}
# Output as table only when the data is homogeneous: when all list items have the same keys
print(stringify(data, {"indentation": 2, "output_as_table": is_homogeneous}))
# {
# "careTakers": ---
# "id", "name"
# 1001, "Joe"
# 1002, "Sarah"
# ---,
# "animals": [
# {
# "animalId": 1,
# "name": "Elephant",
# "description": "Elephants are the largest living land animals."
# },
# {
# "animalId": 2,
# "name": "Giraffe"
# }
# ]
# }See example2_output_as_table.py for a more detailed usage example.
Released under the ISC license.