Skip to content

Commit 020a251

Browse files
committed
Add GetUnsafeString instead of UnsafeBytesToString
1 parent 6c0395c commit 020a251

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,11 @@ func GetString(data []byte, keys ...string) (val string, err error)
8686
```
8787
Returns strings properly handing escaped and unicode characters. Note that this will cause additioal memory allocations.
8888

89-
### **`UnsafeBytesToString`**
90-
If you need string in your app, and ready to sacrifice with support of escaped symbols in favor of speed, you may use `UnsafeBytesToString` method, which returns string mapped to exsting byte slice memory, without any allocations:
89+
### **`GetUnsafeString`**
90+
If you need string in your app, and ready to sacrifice with support of escaped symbols in favor of speed. It returns string mapped to exsting byte slice memory, without any allocations:
9191
```go
92-
v, _, _, _ := jsonparser.Get(data, "person", "name", "title")
93-
switch jsonparser.UnsafeBytesToString(v) {
92+
s, _, := jsonparser.GetUnsafeString(data, "person", "name", "title")
93+
switch s {
9494
case 'CEO':
9595
...
9696
case 'Engineer'

parser.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func searchKeys(data []byte, keys ...string) int {
109109
// Checks to speedup key comparsion
110110
len(keys[level-1]) == se-1 && // if it have same length
111111
data[i] == keys[level-1][0] { // If first character same
112-
if keys[level-1] == UnsafeBytesToString(data[i:i+se-1]) {
112+
if keys[level-1] == unsafeBytesToString(data[i:i+se-1]) {
113113
keyLevel++
114114
// If we found all keys in path
115115
if keyLevel == lk {
@@ -215,7 +215,7 @@ func Get(data []byte, keys ...string) (value []byte, dataType int, offset int, e
215215
return nil, dataType, offset, errors.New("Value looks like Number/Boolean/None, but can't find its end: ',' or '}' symbol")
216216
}
217217

218-
value := UnsafeBytesToString(data[offset : endOffset+end])
218+
value := unsafeBytesToString(data[offset : endOffset+end])
219219

220220
switch data[offset] {
221221
case 't', 'f': // true or false
@@ -303,6 +303,17 @@ func ArrayEach(data []byte, cb func(value []byte, dataType int, offset int, err
303303
return nil
304304
}
305305

306+
// GetUnsafeString returns the value retrieved by `Get`, use creates string without memory allocation by mapping string to slice memory. It does not handle escape symbols.
307+
func GetUnsafeString(data []byte, keys ...string) (val string, err error) {
308+
v, _, _, e := Get(data, keys...)
309+
310+
if e != nil {
311+
return "", e
312+
}
313+
314+
return unsafeBytesToString(v), nil
315+
}
316+
306317
// GetString returns the value retrieved by `Get`, cast to a string if possible, trying to properly handle escape and utf8 symbols
307318
// If key data type do not match, it will return an error.
308319
func GetString(data []byte, keys ...string) (val string, err error) {
@@ -321,7 +332,7 @@ func GetString(data []byte, keys ...string) (val string, err error) {
321332
return string(v), nil
322333
}
323334

324-
s, err := strconv.Unquote(`"` + UnsafeBytesToString(v) + `"`)
335+
s, err := strconv.Unquote(`"` + unsafeBytesToString(v) + `"`)
325336

326337
return s, err
327338
}
@@ -340,7 +351,7 @@ func GetFloat(data []byte, keys ...string) (val float64, err error) {
340351
return 0, fmt.Errorf("Value is not a number: %s", string(v))
341352
}
342353

343-
val, err = strconv.ParseFloat(UnsafeBytesToString(v), 64)
354+
val, err = strconv.ParseFloat(unsafeBytesToString(v), 64)
344355
return
345356
}
346357

@@ -357,7 +368,7 @@ func GetInt(data []byte, keys ...string) (val int64, err error) {
357368
return 0, fmt.Errorf("Value is not a number: %s", string(v))
358369
}
359370

360-
val, err = strconv.ParseInt(UnsafeBytesToString(v), 10, 64)
371+
val, err = strconv.ParseInt(unsafeBytesToString(v), 10, 64)
361372
return
362373
}
363374

@@ -386,7 +397,7 @@ func GetBoolean(data []byte, keys ...string) (val bool, err error) {
386397

387398
// A hack until issue golang/go#2632 is fixed.
388399
// See: https://github.com/golang/go/issues/2632
389-
func UnsafeBytesToString(data []byte) string {
400+
func unsafeBytesToString(data []byte) string {
390401
h := (*reflect.SliceHeader)(unsafe.Pointer(&data))
391402
sh := reflect.StringHeader{Data: h.Data, Len: h.Len}
392403
return *(*string)(unsafe.Pointer(&sh))

0 commit comments

Comments
 (0)