func (json *JSON) GetWithType(name string, typ reflect.Type) (interface{}, bool) {
	value := json.fetch(name)
	if value.IsArray() && typ.Kind() == reflect.Slice {
		array := value.Array()
		result := reflect.MakeSlice(typ, len(array), len(array))
		elmType := typ.Elem()
		for i, elm := range array {
			elmValue, valid := json.convert(elm, elmType)
			if !valid {
				return nil, false
			}
			result.Index(i).Set(reflect.ValueOf(elmValue))
		}
		return result.Interface(), true
	}
	return json.convert(value, typ)
}
GetWithType returns value given from given name and type.
second return value will only be false if the type of parameter is not convertible to requested type.
If value is not convertible to type, it'll return nil, false
If value is not exists, it will return nil, true
package params
import (
	"reflect"
	"sync"
	"time"
	"github.com/tidwall/gjson"
)
type JSON struct {
	gjson.Result
	results sync.Map
}
var _ Params = (*JSON)(nil)
func (json *JSON) Exists(name string) bool {
	return json.fetch(name).Exists()
}
func (json *JSON) Get(name string) interface{} {
	return json.Result.Get(name).Value()
}