JSON
JSON stands for JavaScript Object Notation
JSON is a text format for storing and transporting data
JSON is "self-describing" and easy to understand
JSON Example
This example is a JSON string:
'{"name":"John", "age":30, "car":null}'
It defines an object with 3 properties:
- name
- age
- car
Each property has a value.
If you parse the JSON string with a JavaScript program, you can access the data as an object:
let personName = obj.name;
let personAge = obj.age;
What is JSON?
- JSON stands for JavaScript Object Notation
- JSON is a lightweight data-interchange format
- JSON is plain text written in JavaScript object notation
- JSON is used to send data between computers
- JSON is language independent *
*
The JSON syntax is derived from JavaScript object notation, but the JSON format is text only.
Code for reading and generating JSON exists in many programming languages.
The JSON format was originally specified by Douglas Crockford.
Why Use JSON?
The JSON format is syntactically similar to the code for creating JavaScript objects. Because of this, a JavaScript program can easily convert JSON data into JavaScript objects.
Since the format is text only, JSON data can easily be sent between computers, and used by any programming language.
JavaScript has a built in function for converting JSON strings into JavaScript objects:
JSON.parse[]
JavaScript also has a built in function for converting an object into a JSON string:
JSON.stringify[]
You can receive pure text from a server and use it as a JavaScript object.
You can send a JavaScript object to a server in pure text format.
You can work with data as JavaScript objects, with no complicated parsing and translations.
Storing Data
When storing data, the data has to be a certain format, and regardless of where you choose to store it, text is always one of the legal formats.
JSON makes it possible to store JavaScript objects as text.
In this article, we'll learn about a powerful library for Python called Rich. Rich is a Python library for writing
rich text [with color and style] to the terminal. It lets you display advanced content such as tables, markdown, and syntax-highlighted code. So, why is this useful? Well, if you're not using a tool like Rich, the output of your code on the terminal can be a little boring and difficult to understand. If you want to make it clearer and prettier, you probably want to use Rich – and you've come to the right place to learn how to do it. You can install Rich with pip as: To know what all Rich can do, you can type the following command in the terminal:How to Install
Rich
pip install Rich
python -m rich
Now you can see that we can do quite a lot of things with Rich. Let's try a few of them out to see how they work.
How to Rich print in Python
Rich has the
capability to highlight the output according to the datatype. We'll import the alternative print
function from the Rich library which takes the same arguments as the built-in print
.
To avoid confusion with the built-in print
function, we'll import print
from the rich
library as rprint
.
from rich import print as rprint
nums_list = [1, 2, 3, 4]
rprint[nums_list]
nums_tuple = [1, 2, 3, 4]
rprint[nums_tuple]
nums_dict = {'nums_list': nums_list, 'nums_tuple': nums_tuple}
rprint[nums_dict]
bool_list = [True, False]
rprint[bool_list]
Output:
Do you see how the different data types are highlighted with different colors? This can help us a lot while debugging.
How to Rich inspect in Python
If you use the built-in help
function for viewing the documentation of a library, you'll see a boring output.
import rich
print[help[rich]]
Output:
Rich has an inspect[]
function which can generate a report on any Python object. It is a fantastic debug aid, and a good example of the output that Rich can generate.
from rich import inspect
import rich
inspect[rich]
Output:
How to style your console with Rich
For
complete control over terminal formatting, Rich offers a Console
class.
Let's write a function to merge Python dictionaries.
from rich.console import Console
console = Console[]
def merge_dict[dict_one, dict_two]:
merged_dict = dict_one | dict_two
console.log[merged_dict, log_locals=True]
merge_dict[{'id': 1}, {'name': 'Ashutosh'}]
Output:
In the above example, we have used the log
method that offers the same capabilities as
print, but adds some features useful for debugging a running application.
There are several other methods such as print
, print_json
, out
, rule
, and so on. Learn more about them here.
How to use Tree in Rich
Rich has a Tree
class which can generate a
tree view in the terminal. A tree view is a great way of presenting the contents of a filesystem or any other hierarchical data. Each branch of the tree can have a label which may be text or any other Rich renderable.
Let's see an example by creating a family tree:
from rich.tree import Tree
from rich import print as rprint
tree = Tree["Family Tree"]
tree.add["Mom"]
tree.add["Dad"]
tree.add["Brother"].add["Wife"]
tree.add["[red]Sister"].add["[green]Husband"].add["[blue]Son"]
rprint[tree]
Output:
Once we create an instance of the Tree
class, we can use the add[]
method to add branches to it. To
create a complex tree, you just use the add[]
method to add more branches to it. Notice the Brother and Sister branch in the above example.
In the official documentation, we have a tree.py file that outputs the file structure using Tree. The output looks like this:
How to display a progress bar using Rich
Rich can show continuously updated information about the status of long-running tasks, file copies, and so forth. You can customize this information, too. By default, it provides a description of the 'task,' a progress bar, percentage complete, and anticipated time left.
Multiple tasks are supported with a rich progress display, each with a bar and progress statistics. You can use this to keep track of several jobs that are being worked on in threads or processes.
Let's first try
the progress.track
method to create the progress bar.
from rich.progress import track
from time import sleep
def process_data[]:
sleep[0.02]
for _ in track[range[100], description='[green]Processing data']:
process_data[]
Output:
If we want to record the time when a particular task is finished executing, we can use console.status
instead.
from rich.console import Console
from time import sleep
console = Console[]
data = [1, 2, 3, 4, 5]
with console.status["[bold green]Fetching data..."] as status:
while data:
num = data.pop[0]
sleep[1]
console.log[f"[green]Finish fetching data[/green] {num}"]
console.log[f'[bold][red]Done!']
You can work directly with the Progress class if you need several tasks in the display or want to customize the columns in the progress display. After you've created a Progress object, use [add_task[]
] to add task[s] and [update_progress[]
] to update progress.
The Progress class is intended to be used as a context manager, automatically starting and stopping the progress display.
import time
from rich.progress import Progress
with Progress[] as progress:
task1 = progress.add_task["[red]Downloading...", total=100]
task2 = progress.add_task["[green]Processing...", total=100]
task3 = progress.add_task["[cyan]Installing...", total=100]
while not progress.finished:
progress.update[task1, advance=0.9]
progress.update[task2, advance=0.6]
progress.update[task3, advance=0.3]
time.sleep[0.02]
Output:
How to display Rich Columns in Python
Rich can render text or other Rich renderables in neat columns with the Columns
class. To use, construct a Columns instance with an iterable of
renderables and print it to the Console.
import json
from urllib.request import urlopen
from rich.console import Console
from rich.columns import Columns
from rich.panel import Panel
def get_content[user]:
"""Extract text from user dict."""
country = user["location"]["country"]
name = f"{user['name']['first']} {user['name']['last']}"
return f"[b]{name}[/b]\n[yellow]{country}"
console = Console[]
users = json.loads[urlopen["//randomuser.me/api/?results=30"].read[]]["results"]
user_renderables = [Panel[get_content[user], expand=True] for user in users]
console.print[Columns[user_renderables]]
Output:
How to display Rich tables in Python
Rich’s Table
class offers a variety of ways to render tabular data to the terminal. This class has add_column[]
and
add_row[]
methods to add column and row respectively to the table instance created from the Table
class.
Let's create a table for our todo list. This table will have three columns – S.No., Task, and Status.
from rich.console import Console
from rich.table import Table
table = Table[title="Todo List"]
table.add_column["S. No.", style="cyan", no_wrap=True]
table.add_column["Task", style="magenta"]
table.add_column["Status", justify="right", style="green"]
table.add_row["1", "Buy Milk", "✅"]
table.add_row["2", "Buy Bread", "✅"]
table.add_row["3", "Buy Jam", "❌"]
console = Console[]
console.print[table]
Output:
Wrapping Up
In this tutorial, we learned how to use Rich to beautify the terminal. There are lots of other features that Rich supports. Learn more about them in the official documentation.
Feel free to fork and play with the source code of this article here.
Thanks for reading!
Subscribe to my newsletterLearn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. Get started