Formatting JSON for readability

Charly's Column – JSON

Article from Issue 238/2020
Author(s):

Armed with just json.tool and jq, Charly preps the JSON data delivered by his Philips Hue bridge so that even humans can read it – an essential step towards improving the usability of his home automation system.

Some time ago [1], I briefly talked about how I use the measured values from a lux sensor to control a Hue lighting system. In redecorating my hallway, I added some new lights and removed others. I couldn't remember the light sources' IDs, so I asked the Hue bridge to dump the configuration. What I got was hard-core JSON, but unfortunately not in a human-readable format (Figure 1).

Figure 1: Unreadable: Pure JSON.

There are plenty of tools to make JSON readable. I started with what I already had in place, json.tool, which the Python installation had dumped on my hard disk. I wrote its neatly formatted output to a file in /tmp for further processing (Listing 1).

Listing 1

JSON Query

$ curl --request GET 10.0.0.10/api/w25-4kqL7d|python -m json.tool > /tmp/hue.all

Listing 2

Light Source Script

01 #! /bin/bash
02 WDIR=/usr/local/shellscripts/lux
03 TMPDIR=/tmp
04 HUEBRIDGE=10.0.0.10
05 USER=w25-4kqL7d
06
07 for i in $(seq 1 20); do
08   echo "trying light $i";
09   LAMPTEST=$(jq -r -M ".lights.\"$i\".name" /$TMPDIR/hue.all);
10   if [ "$LAMPTEST" != "null" ]; then
11     echo "Light $i exists: $LAMPTEST"
12   fi
13 done

However, I didn't need the data in Python; I wanted to use the output in a small Bash script. This prompted me to continue processing with jq [2]. The tool claims to be a kind of sed, awk, and grep for JSON. I wanted to find out the current IDs for my light sources, as well as discover their plain text names. Thanks to jq, a tiny script (Listing 2) is all it takes to do this. When I ran it, it gave me the output shown in Listing 3.

Listing 3

Script Output

Light 4 exists: LR_ceiling_desk
Light 5 exists: LR_ceiling_sofa
Light 6 exists: ColorWall1
Light 7 exists: Hall_1F
Light 8 exists: Hall_2F
Light 9 exists: Hall_3F
Light 10 exists: LRTinkeringCorner

The reason why IDs 1 to 3 do not exist is because I dismantled the lights and removed them from the Hue app. The Hue bridge has no reason to re-sort the remaining IDs – which is fortunate, because that would cause total chaos every time I changed a lamp. As jq once again underlines: The shorter a tool's name is; the more important and powerful it is. Lights on!

Infos

  1. "Charly's Column – Hue and Rasp Pi" by Charly Kühnast, Linux Magazine, issue 218, January 2019, p.39, https://www.linux-magazine.com/Issues/2019/218/Hue-and-Rasp-Pi/(language)/eng-US
  2. jq: https://stedolan.github.io/jq/

The Author

Charly Kühnast manages Unix systems in a data center in the Lower Rhine region of Germany. His responsibilities include ensuring the security and availability of firewalls and the DMZ.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

SINGLE ISSUES
 
SUBSCRIPTIONS
 
TABLET & SMARTPHONE APPS
Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • JSON Deep Dive

    JSON data format is a standard feature of today's Internet – and a common option for mobile and desktop apps – but many users still regard it as something of a mystery. We'll take a close look at JSON format and some of the free tools you can use for reading and manipulating JSON data.

  • Enlightened libcoap

    Charly did a spot of shopping in a furniture store and came out with a smart lighting system that he has now automated with a Linux PC: Read on for further enlightenment.

  • Jasonette

    Jasonette makes it supremely easy to build simple and advanced Android apps with a minimum of coding.

  • Two Types of Round Trip

    Due to the COVID-19 lockdown, Charly has time to devote to gadgets like graphical ping tools, flashing space stations, and space walks.

  • Hue and Rasp Pi

    Since his Trådfri Smarthome article over a year ago, sys admin columnist Charly has been receiving messages from readers with two questions: "Can you do that with the Philips' Hue system?" and "Can this also be done with a normal brightness sensor?" Yes and yes!

comments powered by Disqus