Commit Graph

157 Commits

Author SHA1 Message Date
tidwall d10932a0d0 Removed unmarshalling 2020-01-20 12:32:37 -07:00
tidwall 12826915de Removed unneeded comment 2020-01-20 08:29:11 -07:00
aeneasr 8e8823353c
Add @this modifier
This modifier returns the current element as-is and can be used
to retrieve the JSON document itself. It is equivalent to the `#/` JSON Pointer.

Closes #149
2020-01-20 15:01:54 +01:00
tidwall 5c2e4b3824 Fixed modifier pipe issue
This commit fixes an issue where chaining modifiers that used a
string arg would fail to process the modifier following the first.

fixes #143
2019-11-18 09:51:37 -07:00
tidwall c34bf81952 Fix trailing multiselector value 2019-11-02 14:52:36 -07:00
tidwall 1c258afe09 Allow for modifiers in sub-selectors 2019-11-01 05:08:48 -07:00
tidwall c5e72cdf74 Fix panic when key starts at-sign 2019-07-15 07:54:43 -07:00
tidwall 1e964df7d9 Support subqueries
It's now possible to do a query like

  topology.instances.#(service_roles.#(=="one"))#.service_version

On a JSON document such as

  {
    "topology": {
      "instances": [{
        "service_version": "1.2.3",
        "service_roles": ["one", "two"]
      },{
        "service_version": "1.2.4",
        "service_roles": ["three", "four"]
      },{
        "service_version": "1.2.2",
        "service_roles": ["one"]
      }]
    }
  }

Resulting in

  ["1.2.3","1.2.2"]
2019-07-12 06:14:45 -07:00
tidwall d7c940e593 Fix missing raw result for array counts 2019-06-30 04:48:53 -07:00
tidwall 3b5bf6bb5e Added Subselectors
It now possible to select multiple independent paths and join
their results into a single JSON document.

For example, given the following JSON

    {
      "info": {
        "friends": [
          {"first": "Dale", "last": "Murphy", "age": 44},
          {"first": "Roger", "last": "Craig", "age": 68},
          {"first": "Jane", "last": "Murphy", "age": 47}
        ]
      }
    }

The path `[info.friends.0.first,info.friends.1.last]` returns

    ["Dale","Craig"]

Or path `{info.friends.0.first,info.friends.1.last}` returns

    {"first":"Dale","last":"Craig"}

You can also rename Object members such as

`{"alt1":info.friends.0.first,"alt2":info.friends.1.last}` returns

    {"alt1":"Dale","alt2":"Craig"}

Finally you can combine this with any GJSON component

`info.friends.[0.first,1.age]` returns

    ["Dale",68]

This feature was request by @errashe in issue #113.
2019-06-29 15:23:32 -07:00
tidwall 001444ea45 Remove the DisableChaining option
Chaining (pipe character) is now a part of the standard
2019-06-29 12:10:41 -07:00
tidwall 6781e4ee59 Allow paren queries 2019-06-29 11:31:27 -07:00
tidwall ebf0b3fb77 Use no path for simple value queries 2019-06-28 10:18:23 -07:00
tidwall 00b15d756e Added querying array values 2019-06-28 05:55:18 -07:00
tidwall d95cbcaa9d Require multiarr results to always exist 2019-06-28 05:24:28 -07:00
tidwall e91a88bec4 Allow for chaining syntax in multi array 2019-06-28 04:41:32 -07:00
tidwall 7660d0f79f Allow for pipe and dot mixing 2019-06-27 18:27:53 -07:00
tidwall 7b8705a6b6 Use 80 column width 2019-06-27 18:03:46 -07:00
tidwall b877bd43b1 Allow for chaining syntax in array subselects 2019-06-27 17:51:42 -07:00
tidwall 89b19799ff Fix non-existent selectors results 2019-06-27 15:50:15 -07:00
tidwall fb8e539484 Fixed typo in comment
close #109
2019-04-05 11:08:30 -07:00
tidwall eee0b6226f Fixed chained array result 2019-02-16 19:06:55 -07:00
tidwall 1ed2249f74 Added modifiers and path chaining
A modifier is a path component that performs custom processing on
the json.

Multiple paths can be "chained" together using the pipe character.
This is useful for getting results from a modified query.

See the README file for more information.
2019-02-16 18:29:39 -07:00
tidwall 5d7556ad3d Valid json optimization
Added ~20% performance boost be removing extra allocation when
Valid() is called with a json string.
2019-02-16 14:50:53 -07:00
Josh Baker 081192fa2e
Merge pull request #98 from thirstycoda/master
Added not like operator support to query
2018-10-28 08:46:04 -07:00
thirstycoda cced0fa719 Added not like operator support to query 2018-10-28 00:20:01 +01:00
Dustin Blackman 4c7d6ff4a9
fix GetManyBytes to use byte related methods 2018-10-25 16:34:28 -04:00
tidwall 1e3f6aeaa5 Fix leftover array and map values
fixes #81
2018-08-02 08:58:17 -07:00
Josh Baker f92dbfc6b2 Fix different reuslts on duplicate keys
fixes #79
2018-07-30 14:44:31 -07:00
Josh Baker ba784d767a Fix string output for large integers
This fix makes calling String() on a JSON Number return the original value
as it was represented in the JSON document for signed and unsigned integers.
This ensures that very big (plus-53bit) integers are correctly returned.
Floating points maintain their previous behavior [-+]?[0-9]*\.?[0-9]*.

closes #74
2018-07-10 18:10:33 -07:00
Josh Baker f123b34087 Add appengine support 2018-06-21 11:09:58 -07:00
Josh Baker afaeb95620 Fix false validation
closes #73
2018-06-13 11:46:59 -07:00
speier 3a977634eb valid bytes method 2018-04-27 15:54:16 +02:00
hbc 93d61e6369
Add `arrayOrMap` result description
Explain `Result.Value` will return array and map when possible.
2018-02-28 11:21:22 +08:00
Hexilee 9fa9086994 Result.Bool() can parse 'false' as false 2018-02-23 20:25:48 +08:00
Josh Baker aff9dcea3c uncomment function 2018-02-18 10:09:03 -07:00
Josh Baker c2e370e1b3 comment on Valid 2018-02-18 10:05:23 -07:00
Josh Baker a2f35b522e Added support for JSON Lines
Added support for JSON Lines (http://jsonlines.org) using the `..` prefix.
Which when specified, treats the multi-lined document as an array.

For example:

```
{"name": "Gilbert", "age": 61}
{"name": "Alexa", "age": 34}
{"name": "May", "age": 57}
{"name": "Deloise", "age": 44}
```

```
..#                   >> 4
..1                   >> {"name": "Alexa", "age": 34}
..3                   >> {"name": "Deloise", "age": 44}
..#.name              >> ["Gilbert","Alexa","May","Deloise"]
..#[name="May"].age   >> 57
```

Closes #60
2018-02-09 15:42:42 -07:00
Josh Baker 87033efcae array query mismatch, fixes #58 2018-01-23 05:45:05 -07:00
Josh Baker 5cd723d566 simplify getmanybytes 2017-12-22 07:19:48 -07:00
Josh Baker e62d62a3e1 match GetMany and Get results, fixes #55 2017-12-22 06:58:04 -07:00
Josh Baker 080cd22816 fix mysterious missing result
fixes #54
2017-12-13 16:29:27 -07:00
Josh Baker 182ad76050 Array() from null becomes zero length Go array
fixes #53
2017-12-01 14:13:24 -07:00
Erik Johnston 922b012d22 Fix bug where Result.Raw of literal 'false' was 'f' 2017-11-20 17:59:58 +00:00
Josh Baker ac7b6ae6f2 deprecated unmarshalling 2017-10-18 05:19:20 -07:00
Josh Baker 5a69e67cfd GetMany result value missing, fixes #48 2017-09-25 04:39:06 -07:00
Josh Baker 3c91814cf6 GetMany result incorrect, fixes #47 2017-09-25 04:37:57 -07:00
Josh Baker be96719f99 incomplete surrogate codepoints, fixes #38 2017-08-30 10:08:10 -07:00
Josh Baker ccc7f39b3a added IsObject IsArray helper functions 2017-08-14 08:23:21 -07:00
Josh Baker c784c41781 Allow parsing of large integers
This commit fixes an issue in which GJSON was not representing integers
correctly that were greater than 53-bits when calling the result.Int()
and result.Uint() functions. This happened because GJSON stored all
numbers as float64s in the result.Num field, and Int()/Uint() would
simply try to convert the float64 to int64/uint64 by issuing
int64(result.Num) or uint64(result.Num) operations.

Now rather than a simple cast, GJSON checks to see if the float64 is a
whole integer and if the integer can fit within 53-bits. If so, then
the cast method can be used. Otherwise GJSON attempts to parse the
result.Raw directly. If that fails too, it falls back to the original
method.

This fix should maintain compatibility with existing applications.

thanks @joelpresence for reporting
fixes #29
2017-05-25 19:39:18 -07:00
Josh Baker 2e78916f4a option to disable validation 2017-05-08 17:47:46 -07:00
Josh Baker 2555fc0b61 Unmarshal Validation
The Unmarshal function now returns an error if the JSON is not valid.
2017-05-08 17:33:03 -07:00
Josh Baker 3f5adf1ba9 New gjson.Unmarshal function
It's a drop in replacement for json.Unmarshal and you can typically see
a 3 to 4 times boost in performance without the need for external tools
or generators.

This function works almost identically to json.Unmarshal except that
it expects the json to be well-formed prior to being called. Invalid
json will not panic, but it may return back unexpected results.
Therefore the return value of this function will always be nil.

Another difference is that gjson.Unmarshal will automatically attempt
to convert JSON values to any Go type. For example, the JSON string
"100" or the JSON number 100 can be equally assigned to Go string,
int, byte, uint64, etc. This rule applies to all types.
2017-05-07 18:26:54 -07:00
Josh Baker e30a9c1037 Default String() to empty when nonexistent or null
This commit alters the behavior of string handling.

Prior to this change, calling result.String() for nonexistent and null
JSON members would return "null". This runs counter to the zero and omitempty
defaults of Go. Thus I've been seeing in the wild:

    s := result.String()
    if s == "null" || s == "" {
        // ... handle empty string condition
    }

Now we can simply write:

    if result.String() == "" {
        // ... handle empty string condition
    }

It's still possible to explicitly check for null and existence.

    result.Type == gjson.Null
    result.Exists()
2017-04-18 09:28:51 -07:00
Josh Baker 039b641eab added result.Time() function 2017-04-14 17:58:25 -07:00
Josh Baker 635226ae42 minor format updates 2017-04-10 11:41:19 -07:00
Josh Baker 01736e2faf inlined unicode decoding 2017-04-05 10:22:45 -07:00
Josh Baker 458c2c85b8 reorg imports 2017-04-04 10:46:00 -07:00
Josh Baker e0cd4f26a8 proper emoji decoding, fixed #23 2017-04-04 10:42:36 -07:00
Josh Baker e8d1a9ab93 end of path regression, fixes #21
thanks @Poorva17
2017-03-29 08:19:50 -07:00
Josh Baker 9944282cf6 updated comments 2017-03-29 08:18:26 -07:00
Josh Baker 256887a8aa Fix for invalid matching on prefixed key
Thanks to @Poorva17 for finding this issue.
Fixes #20
2017-03-28 17:04:10 -07:00
Josh Baker 09d1c5c5bc added gjson-safe comment 2017-02-05 09:10:42 -07:00
Josh Baker b0e589ad0b index for iterator vals 2016-12-08 15:00:05 -07:00
Josh Baker 456225d161 key index for ForEach 2016-12-07 16:37:33 -07:00
Josh Baker c1e65a498d added ParseBytes 2016-12-02 11:59:39 -07:00
Josh Baker 7afd24f7a2 added != comparison operator 2016-11-30 14:38:08 -07:00
Josh Baker 90669a0cbe query matching with % 2016-11-30 14:32:17 -07:00
Josh Baker 62892351c5 added ForEach function 2016-11-30 10:50:59 -07:00
Josh Baker 86b1b630e4 Query array for multiple matches
It's now possible to query an array for multiple matches by adding the
'#' character immediately following the query.

For example, using the following JSON:

  {
    "friends": [
      {"first": "Dale", "last": "Murphy"},
      {"first": "Roger", "last": "Craig"},
      {"first": "Jane", "last": "Murphy"}
    ]
  }

To return the first match:

  `friends.#[last="Murphy"].first` >> "Dale"

To return all matches:

  `friends.#[last="Murphy"]#.first` >> ["Dale","Jane"]

Thanks to @chuttam for requesting this feature, closes #15.
2016-11-30 07:59:24 -07:00
Josh Baker 1303e83611 fix lead comma error 2016-11-29 18:08:02 -07:00
Josh Baker ae5d307631 Added GetMany. Query many paths at once.
The `GetMany(json, paths...)` function can be used to get multiple
values at one time from the same json string.
This is preferrable to calling `Get(json, path)` over and over.
It's also optimized to scan over a JSON payload once.

This addresses a feature request by @FZambia, and closes #13.
2016-11-28 15:10:11 -07:00
Josh Baker ac4cd1ab55 empty arrays for non-existent values #11 2016-11-02 13:45:25 -07:00
William Poussier 495633298f Modify behavior of Array() on non-array result.
Closes #10.
2016-11-02 20:20:24 +01:00
Josh Baker a02d704254 added result.Uint() function resolves #9 2016-11-02 08:24:13 -07:00
Josh Baker 27c108f475 fuzzing test on parse 2016-10-18 17:13:15 -07:00
Josh Baker 800ce5e927 added Index field 2016-10-17 17:39:27 -07:00
Josh Baker 2dec1c4e7b safe slices 2016-09-09 15:49:48 -07:00
Josh Baker 7c631e9868 fix out of range error 2016-09-08 09:02:40 -07:00
Josh Baker b39aa6075f bytes substring optimization 2016-09-08 08:34:01 -07:00
Josh Baker 124a25db9e added direct bytes interface 2016-09-08 08:08:53 -07:00
Josh Baker f40fe4ac37 subquery syntax 2016-08-31 13:23:20 -07:00
Josh Baker 4d7d1a76a8 import match package 2016-08-30 07:21:20 -07:00
Josh Baker 3913125ac5 faster map unmarshalling 2016-08-25 20:17:32 -07:00
Josh Baker a6e9688393 lessen frequency of assignments in path routine 2016-08-25 10:05:03 -07:00
Josh Baker 81391efb66 minor optz 2016-08-25 09:40:50 -07:00
Josh Baker 19f9404e51 Updated logic for better ssa compilation in Go 1.7 2016-08-25 07:22:48 -07:00
Josh Baker ffbbc90c13 remove commented code 2016-08-24 13:35:10 -07:00
Josh Baker 4fceff029c unicode patterns 2016-08-24 13:26:44 -07:00
Josh Baker 67e38154bd sped up map[string]interface{} unmarshalling 2016-08-24 12:12:07 -07:00
Josh Baker 16ecfe5970 addtional test 2016-08-22 08:25:33 -07:00
Josh Baker 696d68fd62 minor optimizations 2016-08-22 07:39:41 -07:00
Josh Baker cd422a3e10 Removed Multi. Added Parse and result.Get funcs
The Multi field was too bulky. fixes #4
Added a Parse(json) function that will do a simple parse of json.
Added a result.Get(path) function that returns a child result.
Added Bool(), Int(), and Float() to result type. fixes #5
2016-08-22 06:05:51 -07:00
Josh Baker 29fecf859f minor performance optz 2016-08-21 10:10:55 -07:00
Josh Baker cec0cb946f small bump in performance 2016-08-21 07:17:11 -07:00
Josh Baker 0757a4d1e7 get nested array values, fixes #4
To get all the friends last names use:

"friends.#.last"

{
  "friends": [
    {"first": "James", "last": "Murphy"},
    {"first": "Roger", "last": "Craig"}
  ]
}
2016-08-21 06:57:13 -07:00
Josh Baker 260ef19a2e fix path issue 2016-08-21 05:35:33 -07:00
Josh Baker 1b1f52024e minor optimization 2016-08-21 05:32:34 -07:00
Josh Baker 3a4fec0606 added more comments and a couple minor optimizations 2016-08-19 13:51:52 -07:00
Josh Baker 0e6e567424 optimistic optimizations 2016-08-19 11:22:59 -07:00