jc - A JSON Companion
jc is a command-line tool for transforming output into json. So what
does that mean? In other words, you can turn the messy text output from common
CLI tools into clean json.
Let’s look at a quick example using dig:
$ dig example.com
; <<>> DiG 9.10.6 <<>> example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42404
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;example.com. IN A
;; ANSWER SECTION:
example.com. 137 IN A 23.192.228.80
example.com. 137 IN A 23.192.228.84
example.com. 137 IN A 23.220.75.232
example.com. 137 IN A 23.220.75.245
example.com. 137 IN A 23.215.0.136
example.com. 137 IN A 23.215.0.138
;; Query time: 13 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Oct 12 23:45:22 +03 2025
;; MSG SIZE rcvd: 136
The output from dig contains a lot of data. Alright, let’s convert it to
json!
$ dig example.com | jc --dig
[{"id":10302,"opcode":"QUERY","status":"NOERROR","flags":["qr","rd","ra","ad"],"query_num":1,"answer_num":6,"authority_num":0,"additional_num":1,"opt_pseudosection":{"edns":{"version":0,"flags":[],"udp":512}},"question":{"name":"example.com.","class":"IN","type":"A"},"answer":[{"name":"example.com.","class":"IN","type":"A","ttl":108,"data":"23.220.75.245"},{"name":"example.com.","class":"IN","type":"A","ttl":108,"data":"23.192.228.84"},{"name":"example.com.","class":"IN","type":"A","ttl":108,"data":"23.192.228.80"},{"name":"example.com.","class":"IN","type":"A","ttl":108,"data":"23.220.75.232"},{"name":"example.com.","class":"IN","type":"A","ttl":108,"data":"23.215.0.138"},{"name":"example.com.","class":"IN","type":"A","ttl":108,"data":"23.215.0.136"}],"query_time":11,"server":"8.8.8.8#53(8.8.8.8)","when":"Sun Oct 12 22:55:51 +03 2025","rcvd":136,"when_epoch":1760298951,"when_epoch_utc":null}]
Still ugly? Yep!
$ dig example.com | jc --dig | jq
Result:
[
{
"id": 3386,
"opcode": "QUERY",
"status": "NOERROR",
"flags": [
"qr",
"rd",
"ra",
"ad"
],
"query_num": 1,
"answer_num": 6,
"authority_num": 0,
"additional_num": 1,
"opt_pseudosection": {
"edns": {
"version": 0,
"flags": [],
"udp": 512
}
},
"question": {
"name": "example.com.",
"class": "IN",
"type": "A"
},
"answer": [
{
"name": "example.com.",
"class": "IN",
"type": "A",
"ttl": 121,
"data": "23.215.0.136"
},
{
"name": "example.com.",
"class": "IN",
"type": "A",
"ttl": 121,
"data": "23.192.228.80"
},
{
"name": "example.com.",
"class": "IN",
"type": "A",
"ttl": 121,
"data": "23.215.0.138"
},
{
"name": "example.com.",
"class": "IN",
"type": "A",
"ttl": 121,
"data": "23.220.75.232"
},
{
"name": "example.com.",
"class": "IN",
"type": "A",
"ttl": 121,
"data": "23.192.228.84"
},
{
"name": "example.com.",
"class": "IN",
"type": "A",
"ttl": 121,
"data": "23.220.75.245"
}
],
"query_time": 11,
"server": "8.8.8.8#53(8.8.8.8)",
"when": "Sun Oct 12 23:49:27 +03 2025",
"rcvd": 136,
"when_epoch": 1760302167,
"when_epoch_utc": null
}
]
Fantastic right? You can install jc from brew (macOS):
brew install jc
brew install jq # in case you don’t have jq installed
It’s an open-source tool:
https://github.com/kellyjonbrazil/jc
Examples from jc’s GitHub Page
$ dig example.com | jc --dig | jq -r '.[].answer[].data'
23.192.228.84
23.215.0.136
23.220.75.245
23.192.228.80
23.215.0.138
23.220.75.232
# or magic syntax
$ jc dig example.com | jq -r '.[].answer[].data'
$ git log | jc --git-log | jq
$ ifconfig | jc --ifconfig
$ echo "${JWT_TOKEN}" | jc --jwt
$ echo "/Users/admin/.docker/bin" | jc --path | jq
$ cat foo.yaml | jc --yaml | jq
There are tons of parsers available on GitHub!
Enjoy!