diff --git a/docs/content/3.manual/manual.yml b/docs/content/3.manual/manual.yml index 7272c880..14ac8679 100644 --- a/docs/content/3.manual/manual.yml +++ b/docs/content/3.manual/manual.yml @@ -160,10 +160,13 @@ sections: - title: "`.foo`" body: | - The simplest *useful* filter is .foo. When given a + The simplest *useful* filter is `.foo`. When given a JSON object (aka dictionary or hash) as input, it produces the value at the key "foo", or null if there's none present. + If the key contains special characters, you need to surround + it with double quotes like this: `."foo$"`. + examples: - program: '.foo' input: '{"foo": 42, "bar": "less interesting data"}' @@ -171,6 +174,9 @@ sections: - program: '.foo' input: '{"notfoo": true, "alsonotfoo": false}' output: ['null'] + - program: '."foo"' + input: '{"foo": 42}' + output: [42] - title: "`.[foo]`, `.[2]`, `.[10:15]`" body: | diff --git a/parser.y b/parser.y index b7ac00b2..8d451e9d 100644 --- a/parser.y +++ b/parser.y @@ -406,6 +406,12 @@ Term FIELD { FIELD { $$ = gen_index(gen_noop(), gen_const($1)); } | +Term '.' String { + $$ = gen_index($1, $3); +} | +'.' String { + $$ = gen_index(gen_noop(), $2); +} | '.' error { FAIL(@$, "try .[\"field\"] instead of .field for unusually named fields"); $$ = gen_noop(); diff --git a/tests/all.test b/tests/all.test index cc97961f..122b9a61 100644 --- a/tests/all.test +++ b/tests/all.test @@ -115,6 +115,10 @@ null {"foo": {"bar": 42}, "bar": "badvalue"} 42 +."foo"."bar" +{"foo": {"bar": 20}} +20 + # # Multiple outputs, iteration