mirror of https://github.com/tidwall/gjson.git
Compare commits
2 Commits
1ff915dd81
...
6ee9f877d6
Author | SHA1 | Date |
---|---|---|
tidwall | 6ee9f877d6 | |
tidwall | be1bb7d64a |
10
README.md
10
README.md
|
@ -427,16 +427,6 @@ if result.Index > 0 {
|
||||||
|
|
||||||
This is a best-effort no allocation sub slice of the original json. This method utilizes the `result.Index` field, which is the position of the raw data in the original json. It's possible that the value of `result.Index` equals zero, in which case the `result.Raw` is converted to a `[]byte`.
|
This is a best-effort no allocation sub slice of the original json. This method utilizes the `result.Index` field, which is the position of the raw data in the original json. It's possible that the value of `result.Index` equals zero, in which case the `result.Raw` is converted to a `[]byte`.
|
||||||
|
|
||||||
## Get multiple values at once
|
|
||||||
|
|
||||||
The `GetMany` function can be used to get multiple values at the same time.
|
|
||||||
|
|
||||||
```go
|
|
||||||
results := gjson.GetMany(json, "name.first", "name.last", "age")
|
|
||||||
```
|
|
||||||
|
|
||||||
The return value is a `[]Result`, which will always contain exactly the same number of items as the input paths.
|
|
||||||
|
|
||||||
## Performance
|
## Performance
|
||||||
|
|
||||||
Benchmarks of GJSON alongside [encoding/json](https://golang.org/pkg/encoding/json/),
|
Benchmarks of GJSON alongside [encoding/json](https://golang.org/pkg/encoding/json/),
|
||||||
|
|
30
gjson.go
30
gjson.go
|
@ -3410,7 +3410,7 @@ func (t Result) Path(json string) string {
|
||||||
if !rcomp.Exists() {
|
if !rcomp.Exists() {
|
||||||
goto fail
|
goto fail
|
||||||
}
|
}
|
||||||
comp := escapeComp(rcomp.String())
|
comp := Escape(rcomp.String())
|
||||||
path = append(path, '.')
|
path = append(path, '.')
|
||||||
path = append(path, comp...)
|
path = append(path, comp...)
|
||||||
}
|
}
|
||||||
|
@ -3425,17 +3425,31 @@ fail:
|
||||||
// isSafePathKeyChar returns true if the input character is safe for not
|
// isSafePathKeyChar returns true if the input character is safe for not
|
||||||
// needing escaping.
|
// needing escaping.
|
||||||
func isSafePathKeyChar(c byte) bool {
|
func isSafePathKeyChar(c byte) bool {
|
||||||
return c <= ' ' || c > '~' || c == '_' || c == '-' || c == ':' ||
|
return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
|
||||||
(c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
|
(c >= '0' && c <= '9') || c <= ' ' || c > '~' || c == '_' ||
|
||||||
(c >= '0' && c <= '9')
|
c == '-' || c == ':'
|
||||||
}
|
}
|
||||||
|
|
||||||
// escapeComp escaped a path compontent, making it safe for generating a
|
// Escape returns an escaped path component.
|
||||||
// path for later use.
|
//
|
||||||
func escapeComp(comp string) string {
|
// json := `{
|
||||||
|
// "user":{
|
||||||
|
// "first.name": "Janet",
|
||||||
|
// "last.name": "Prichard"
|
||||||
|
// }
|
||||||
|
// }`
|
||||||
|
// user := gjson.Get(json, "user")
|
||||||
|
// println(user.Get(gjson.Escape("first.name"))
|
||||||
|
// println(user.Get(gjson.Escape("last.name"))
|
||||||
|
// // Output:
|
||||||
|
// // Janet
|
||||||
|
// // Prichard
|
||||||
|
func Escape(comp string) string {
|
||||||
for i := 0; i < len(comp); i++ {
|
for i := 0; i < len(comp); i++ {
|
||||||
if !isSafePathKeyChar(comp[i]) {
|
if !isSafePathKeyChar(comp[i]) {
|
||||||
ncomp := []byte(comp[:i])
|
ncomp := make([]byte, len(comp)+1)
|
||||||
|
copy(ncomp, comp[:i])
|
||||||
|
ncomp = ncomp[:i]
|
||||||
for ; i < len(comp); i++ {
|
for ; i < len(comp); i++ {
|
||||||
if !isSafePathKeyChar(comp[i]) {
|
if !isSafePathKeyChar(comp[i]) {
|
||||||
ncomp = append(ncomp, '\\')
|
ncomp = append(ncomp, '\\')
|
||||||
|
|
|
@ -2701,3 +2701,16 @@ func TestModDig(t *testing.T) {
|
||||||
assert(t, Get(json, "@dig:name").String() == `["melinda","jake"]`)
|
assert(t, Get(json, "@dig:name").String() == `["melinda","jake"]`)
|
||||||
assert(t, Get(json, "@dig:secret").String() == `["password"]`)
|
assert(t, Get(json, "@dig:secret").String() == `["password"]`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEscape(t *testing.T) {
|
||||||
|
json := `{
|
||||||
|
"user":{
|
||||||
|
"first.name": "Janet",
|
||||||
|
"last.name": "Prichard"
|
||||||
|
}
|
||||||
|
}`
|
||||||
|
user := Get(json, "user")
|
||||||
|
assert(t, user.Get(Escape("first.name")).String() == "Janet")
|
||||||
|
assert(t, user.Get(Escape("last.name")).String() == "Prichard")
|
||||||
|
assert(t, user.Get("first.name").String() == "")
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue