mirror of
https://github.com/mikefarah/yq.git
synced 2024-12-19 20:19:04 +00:00
252 lines
4.2 KiB
Markdown
252 lines
4.2 KiB
Markdown
# JSON
|
|
|
|
Encode and decode to and from JSON. Supports multiple JSON documents in a single file (e.g. NDJSON).
|
|
|
|
Note that YAML is a superset of (single document) JSON - so you don't have to use the JSON parser to read JSON when there is only one JSON document in the input. You will probably want to pretty print the result in this case, to get idiomatic YAML styling.
|
|
|
|
|
|
## 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:
|
|
```json
|
|
{"cat": "meow"}
|
|
```
|
|
then
|
|
```bash
|
|
yq -p=json sample.json
|
|
```
|
|
will output
|
|
```yaml
|
|
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:
|
|
```json
|
|
{"a":"Easy! as one two three","b":{"c":2,"d":[3,4]}}
|
|
```
|
|
then
|
|
```bash
|
|
yq -p=json sample.json
|
|
```
|
|
will output
|
|
```yaml
|
|
a: Easy! as one two three
|
|
b:
|
|
c: 2
|
|
d:
|
|
- 3
|
|
- 4
|
|
```
|
|
|
|
## Encode json: simple
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
cat: meow
|
|
```
|
|
then
|
|
```bash
|
|
yq -o=json '.' sample.yml
|
|
```
|
|
will output
|
|
```json
|
|
{
|
|
"cat": "meow"
|
|
}
|
|
```
|
|
|
|
## Encode json: simple - in one line
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
cat: meow # this is a comment, and it will be dropped.
|
|
```
|
|
then
|
|
```bash
|
|
yq -o=json -I=0 '.' sample.yml
|
|
```
|
|
will output
|
|
```json
|
|
{"cat":"meow"}
|
|
```
|
|
|
|
## Encode json: comments
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
cat: meow # this is a comment, and it will be dropped.
|
|
```
|
|
then
|
|
```bash
|
|
yq -o=json '.' sample.yml
|
|
```
|
|
will output
|
|
```json
|
|
{
|
|
"cat": "meow"
|
|
}
|
|
```
|
|
|
|
## Encode json: anchors
|
|
Anchors are dereferenced
|
|
|
|
Given a sample.yml file of:
|
|
```yaml
|
|
cat: &ref meow
|
|
anotherCat: *ref
|
|
```
|
|
then
|
|
```bash
|
|
yq -o=json '.' sample.yml
|
|
```
|
|
will output
|
|
```json
|
|
{
|
|
"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:
|
|
```yaml
|
|
things: [{stuff: cool}, {whatever: cat}]
|
|
```
|
|
then
|
|
```bash
|
|
yq -o=json -I=0 '.things[]' sample.yml
|
|
```
|
|
will output
|
|
```json
|
|
{"stuff":"cool"}
|
|
{"whatever":"cat"}
|
|
```
|
|
|
|
## Roundtrip JSON Lines / NDJSON
|
|
Given a sample.json file of:
|
|
```json
|
|
{"this": "is a multidoc json file"}
|
|
{"each": ["line is a valid json document"]}
|
|
{"a number": 4}
|
|
|
|
```
|
|
then
|
|
```bash
|
|
yq -p=json -o=json -I=0 sample.json
|
|
```
|
|
will output
|
|
```yaml
|
|
{"this":"is a multidoc json file"}
|
|
{"each":["line is a valid json document"]}
|
|
{"a number":4}
|
|
```
|
|
|
|
## Roundtrip multi-document JSON
|
|
The parser can also handle multiple multi-line json documents in a single file (despite this not being in the JSON Lines / NDJSON spec). Typically you would have one entire JSON document per line, but the parser also supports multiple multi-line json documents
|
|
|
|
Given a sample.json file of:
|
|
```json
|
|
{
|
|
"this": "is a multidoc json file"
|
|
}
|
|
{
|
|
"it": [
|
|
"has",
|
|
"consecutive",
|
|
"json documents"
|
|
]
|
|
}
|
|
{
|
|
"a number": 4
|
|
}
|
|
|
|
```
|
|
then
|
|
```bash
|
|
yq -p=json -o=json -I=2 sample.json
|
|
```
|
|
will output
|
|
```yaml
|
|
{
|
|
"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:
|
|
```json
|
|
{"this": "is a multidoc json file"}
|
|
{"each": ["line is a valid json document"]}
|
|
{"a number": 4}
|
|
|
|
```
|
|
then
|
|
```bash
|
|
yq -p=json -o=json -I=0 '(select(di == 1) | .each ) += "cool"' sample.json
|
|
```
|
|
will output
|
|
```yaml
|
|
{"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:
|
|
```json
|
|
{"this": "is a multidoc json file"}
|
|
{"each": ["line is a valid json document"]}
|
|
{"a number": 4}
|
|
|
|
```
|
|
then
|
|
```bash
|
|
yq -p=json -o=json -I=0 '(select(has("each")) | .each ) += "cool"' sample.json
|
|
```
|
|
will output
|
|
```yaml
|
|
{"this":"is a multidoc json file"}
|
|
{"each":["line is a valid json document","cool"]}
|
|
{"a number":4}
|
|
```
|
|
|
|
## Decode JSON Lines / NDJSON
|
|
Given a sample.json file of:
|
|
```json
|
|
{"this": "is a multidoc json file"}
|
|
{"each": ["line is a valid json document"]}
|
|
{"a number": 4}
|
|
|
|
```
|
|
then
|
|
```bash
|
|
yq -p=json sample.json
|
|
```
|
|
will output
|
|
```yaml
|
|
this: is a multidoc json file
|
|
---
|
|
each:
|
|
- line is a valid json document
|
|
---
|
|
a number: 4
|
|
```
|
|
|