yq/pkg/yqlib/doc/usage/convert.md
2022-07-27 12:26:22 +10:00

4.4 KiB

JSON

Encode and decode to and from JSON. Note that, unless you have multiple JSON documents in a single file, YAML is a superset of JSON - so yq can read any json file without doing anything special.

If you do have mulitple JSON documents in a single file (e.g. NDJSON) then you will need to explicity use the json parser -p=json.

This means you don't need to 'convert' a JSON file to YAML - however if you want idiomatic YAML styling, then you can use the -P/--prettyPrint flag, see examples below.

{% hint style="warning" %} Note that versions prior to 4.18 require the 'eval/e' command to be specified.

yq e <exp> <file> {% endhint %}

Parse json: simple

JSON is a subset of yaml, so all you need to do is prettify the output

Given a sample.json file of:

{"cat": "meow"}

then

yq -P '.' sample.json

will output

cat: meow

Parse json: complex

JSON is a subset of yaml, so all you need to do is prettify the output

Given a sample.json file of:

{"a":"Easy! as one two three","b":{"c":2,"d":[3,4]}}

then

yq -P '.' sample.json

will output

a: Easy! as one two three
b:
  c: 2
  d:
    - 3
    - 4

Encode json: simple

Given a sample.yml file of:

cat: meow

then

yq -o=json '.' sample.yml

will output

{
  "cat": "meow"
}

Encode json: simple - in one line

Given a sample.yml file of:

cat: meow # this is a comment, and it will be dropped.

then

yq -o=json -I=0 '.' sample.yml

will output

{"cat":"meow"}

Encode json: comments

Given a sample.yml file of:

cat: meow # this is a comment, and it will be dropped.

then

yq -o=json '.' sample.yml

will output

{
  "cat": "meow"
}

Encode json: anchors

Anchors are dereferenced

Given a sample.yml file of:

cat: &ref meow
anotherCat: *ref

then

yq -o=json '.' sample.yml

will output

{
  "cat": "meow",
  "anotherCat": "meow"
}

Encode json: multiple results

Each matching node is converted into a json doc. This is best used with 0 indent (json document per line)

Given a sample.yml file of:

things: [{stuff: cool}, {whatever: cat}]

then

yq -o=json -I=0 '.things[]' sample.yml

will output

{"stuff":"cool"}
{"whatever":"cat"}

Roundtrip NDJSON

Unfortunately the json encoder strips leading spaces of values.

Given a sample.json file of:

{"this": "is a multidoc json file"}
{"each": ["line is a valid json document"]}
{"a number": 4}

then

yq -p=json -o=json -I=0 sample.json

will output

{"this":"is a multidoc json file"}
{"each":["line is a valid json document"]}
{"a number":4}

Roundtrip multi-document JSON

The NDJSON parser can also handle multiple multi-line json documents in a single file!

Given a sample.json file of:

{
	"this": "is a multidoc json file"
}
{
	"it": [
		"has",
		"consecutive",
		"json documents"
	]
}
{
	"a number": 4
}

then

yq -p=json -o=json -I=2 sample.json

will output

{
  "this": "is a multidoc json file"
}
{
  "it": [
    "has",
    "consecutive",
    "json documents"
  ]
}
{
  "a number": 4
}

Update a specific document in a multi-document json

Documents are indexed by the documentIndex or di operator.

Given a sample.json file of:

{"this": "is a multidoc json file"}
{"each": ["line is a valid json document"]}
{"a number": 4}

then

yq -p=json -o=json -I=0 '(select(di == 1) | .each ) += "cool"' sample.json

will output

{"this":"is a multidoc json file"}
{"each":["line is a valid json document","cool"]}
{"a number":4}

Find and update a specific document in a multi-document json

Use expressions as you normally would.

Given a sample.json file of:

{"this": "is a multidoc json file"}
{"each": ["line is a valid json document"]}
{"a number": 4}

then

yq -p=json -o=json -I=0 '(select(has("each")) | .each ) += "cool"' sample.json

will output

{"this":"is a multidoc json file"}
{"each":["line is a valid json document","cool"]}
{"a number":4}

Decode NDJSON

Given a sample.json file of:

{"this": "is a multidoc json file"}
{"each": ["line is a valid json document"]}
{"a number": 4}

then

yq -p=json sample.json

will output

this: is a multidoc json file
---
each:
    - line is a valid json document
---
a number: 4