2016-09-12 07:25:09 +03:00
|
|
|
// Package gjson provides searching for json strings.
|
|
|
|
package gjson
|
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
"strconv"
|
|
|
|
"unsafe"
|
|
|
|
|
|
|
|
"github.com/tidwall/match"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Type is Result type
|
|
|
|
type Type int
|
|
|
|
|
|
|
|
const (
|
|
|
|
// Null is a null json value
|
|
|
|
Null Type = iota
|
|
|
|
// False is a json false boolean
|
|
|
|
False
|
|
|
|
// Number is json number
|
|
|
|
Number
|
|
|
|
// String is a json string
|
|
|
|
String
|
|
|
|
// True is a json true boolean
|
|
|
|
True
|
|
|
|
// JSON is a raw block of JSON
|
|
|
|
JSON
|
|
|
|
)
|
|
|
|
|
2016-12-12 20:33:28 +03:00
|
|
|
// String returns a string representation of the type.
|
|
|
|
func (t Type) String() string {
|
|
|
|
switch t {
|
|
|
|
default:
|
|
|
|
return ""
|
|
|
|
case Null:
|
|
|
|
return "Null"
|
|
|
|
case False:
|
|
|
|
return "False"
|
|
|
|
case Number:
|
|
|
|
return "Number"
|
|
|
|
case String:
|
|
|
|
return "String"
|
|
|
|
case True:
|
|
|
|
return "True"
|
|
|
|
case JSON:
|
|
|
|
return "JSON"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-12 07:25:09 +03:00
|
|
|
// Result represents a json value that is returned from Get().
|
|
|
|
type Result struct {
|
|
|
|
// Type is the json type
|
|
|
|
Type Type
|
|
|
|
// Raw is the raw json
|
|
|
|
Raw string
|
|
|
|
// Str is the json string
|
|
|
|
Str string
|
|
|
|
// Num is the json number
|
|
|
|
Num float64
|
2016-12-12 20:33:28 +03:00
|
|
|
// Index of raw value in original json, zero means index unknown
|
|
|
|
Index int
|
2016-09-12 07:25:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// String returns a string representation of the value.
|
|
|
|
func (t Result) String() string {
|
|
|
|
switch t.Type {
|
|
|
|
default:
|
|
|
|
return "null"
|
|
|
|
case False:
|
|
|
|
return "false"
|
|
|
|
case Number:
|
|
|
|
return strconv.FormatFloat(t.Num, 'f', -1, 64)
|
|
|
|
case String:
|
|
|
|
return t.Str
|
|
|
|
case JSON:
|
|
|
|
return t.Raw
|
|
|
|
case True:
|
|
|
|
return "true"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Bool returns an boolean representation.
|
|
|
|
func (t Result) Bool() bool {
|
|
|
|
switch t.Type {
|
|
|
|
default:
|
|
|
|
return false
|
|
|
|
case True:
|
|
|
|
return true
|
|
|
|
case String:
|
|
|
|
return t.Str != "" && t.Str != "0"
|
|
|
|
case Number:
|
|
|
|
return t.Num != 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Int returns an integer representation.
|
|
|
|
func (t Result) Int() int64 {
|
|
|
|
switch t.Type {
|
|
|
|
default:
|
|
|
|
return 0
|
|
|
|
case True:
|
|
|
|
return 1
|
|
|
|
case String:
|
|
|
|
n, _ := strconv.ParseInt(t.Str, 10, 64)
|
|
|
|
return n
|
|
|
|
case Number:
|
|
|
|
return int64(t.Num)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-12 20:33:28 +03:00
|
|
|
// Uint returns an unsigned integer representation.
|
|
|
|
func (t Result) Uint() uint64 {
|
|
|
|
switch t.Type {
|
|
|
|
default:
|
|
|
|
return 0
|
|
|
|
case True:
|
|
|
|
return 1
|
|
|
|
case String:
|
|
|
|
n, _ := strconv.ParseUint(t.Str, 10, 64)
|
|
|
|
return n
|
|
|
|
case Number:
|
|
|
|
return uint64(t.Num)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-09-12 07:25:09 +03:00
|
|
|
// Float returns an float64 representation.
|
|
|
|
func (t Result) Float() float64 {
|
|
|
|
switch t.Type {
|
|
|
|
default:
|
|
|
|
return 0
|
|
|
|
case True:
|
|
|
|
return 1
|
|
|
|
case String:
|
|
|
|
n, _ := strconv.ParseFloat(t.Str, 64)
|
|
|
|
return n
|
|
|
|
case Number:
|
|
|
|
return t.Num
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-12-12 20:33:28 +03:00
|
|
|
// Array returns back an array of values.
|
|
|
|
// If the result represents a non-existent value, then an empty array will be returned.
|
|
|
|
// If the result is not a JSON array, the return value will be an array containing one result.
|
2016-09-12 07:25:09 +03:00
|
|
|
func (t Result) Array() []Result {
|
2016-12-12 20:33:28 +03:00
|
|
|
if !t.Exists() {
|
2016-09-12 07:25:09 +03:00
|
|
|
return nil
|
|
|
|
}
|
2016-12-12 20:33:28 +03:00
|
|
|
if t.Type != JSON {
|
|
|
|
return []Result{t}
|
|
|
|
}
|
2016-09-12 07:25:09 +03:00
|
|
|
< |