mirror of https://github.com/tidwall/gjson.git
fix out of range error
This commit is contained in:
parent
b39aa6075f
commit
7c631e9868
5
gjson.go
5
gjson.go
|
@ -1154,10 +1154,11 @@ func GetBytes(json []byte, path string) Result {
|
||||||
} else if rawh.Data == 0 {
|
} else if rawh.Data == 0 {
|
||||||
result.Raw = ""
|
result.Raw = ""
|
||||||
result.Str = string(*(*[]byte)(unsafe.Pointer(&result.Str)))
|
result.Str = string(*(*[]byte)(unsafe.Pointer(&result.Str)))
|
||||||
} else if strh.Data >= rawh.Data && strh.Len <= rawh.Len {
|
} else if strh.Data >= rawh.Data &&
|
||||||
|
int(strh.Data)+strh.Len <= int(rawh.Data)+rawh.Len {
|
||||||
// Str is a substring of Raw.
|
// Str is a substring of Raw.
|
||||||
result.Raw = string(*(*[]byte)(unsafe.Pointer(&result.Raw)))
|
|
||||||
start := int(strh.Data - rawh.Data)
|
start := int(strh.Data - rawh.Data)
|
||||||
|
result.Raw = string(*(*[]byte)(unsafe.Pointer(&result.Raw)))
|
||||||
result.Str = result.Raw[start : start+strh.Len]
|
result.Str = result.Raw[start : start+strh.Len]
|
||||||
} else {
|
} else {
|
||||||
result.Raw = string(*(*[]byte)(unsafe.Pointer(&result.Raw)))
|
result.Raw = string(*(*[]byte)(unsafe.Pointer(&result.Raw)))
|
||||||
|
|
|
@ -145,24 +145,23 @@ func TestByteSafety(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func get(json, path string) Result {
|
||||||
|
return GetBytes([]byte(basicJSONB), path)
|
||||||
|
}
|
||||||
|
|
||||||
func TestBasic(t *testing.T) {
|
func TestBasic(t *testing.T) {
|
||||||
var mtok Result
|
var mtok Result
|
||||||
|
|
||||||
mtok = Get(basicJSON, `loggy.programmers.#[age=101].firstName`)
|
mtok = get(basicJSON, `loggy.programmers.#[age=101].firstName`)
|
||||||
if mtok.String() != "1002.3" {
|
if mtok.String() != "1002.3" {
|
||||||
t.Fatalf("expected %v, got %v", "1002,3", mtok.String())
|
t.Fatalf("expected %v, got %v", "1002,3", mtok.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
mtok = GetBytes(basicJSONB, `loggy.programmers.#[age=101].firstName`)
|
mtok = get(basicJSON, `loggy.programmers.#[firstName == "Brett"].email`)
|
||||||
if mtok.String() != "1002.3" {
|
|
||||||
t.Fatalf("expected %v, got %v", "1002,3", mtok.String())
|
|
||||||
}
|
|
||||||
|
|
||||||
mtok = Get(basicJSON, `loggy.programmers.#[firstName == "Brett"].email`)
|
|
||||||
if mtok.String() != "aaaa" {
|
if mtok.String() != "aaaa" {
|
||||||
t.Fatalf("expected %v, got %v", "aaaa", mtok.String())
|
t.Fatalf("expected %v, got %v", "aaaa", mtok.String())
|
||||||
}
|
}
|
||||||
mtok = Get(basicJSON, "loggy")
|
mtok = get(basicJSON, "loggy")
|
||||||
if mtok.Type != JSON {
|
if mtok.Type != JSON {
|
||||||
t.Fatalf("expected %v, got %v", JSON, mtok.Type)
|
t.Fatalf("expected %v, got %v", JSON, mtok.Type)
|
||||||
}
|
}
|
||||||
|
@ -193,7 +192,7 @@ func TestBasic(t *testing.T) {
|
||||||
if token = Parse(`"\"he\nllo\""`); token.Str != "\"he\nllo\"" {
|
if token = Parse(`"\"he\nllo\""`); token.Str != "\"he\nllo\"" {
|
||||||
t.Fatal("expected %v, got %v", "\"he\nllo\"", token.Str)
|
t.Fatal("expected %v, got %v", "\"he\nllo\"", token.Str)
|
||||||
}
|
}
|
||||||
mtok = Get(basicJSON, "loggy.programmers.#.firstName")
|
mtok = get(basicJSON, "loggy.programmers.#.firstName")
|
||||||
if len(mtok.Array()) != 4 {
|
if len(mtok.Array()) != 4 {
|
||||||
t.Fatalf("expected 4, got %v", len(mtok.Array()))
|
t.Fatalf("expected 4, got %v", len(mtok.Array()))
|
||||||
}
|
}
|
||||||
|
@ -202,7 +201,7 @@ func TestBasic(t *testing.T) {
|
||||||
t.Fatalf("expected '%v', got '%v'", ex, mtok.Array()[i].String())
|
t.Fatalf("expected '%v', got '%v'", ex, mtok.Array()[i].String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mtok = Get(basicJSON, "loggy.programmers.#.asd")
|
mtok = get(basicJSON, "loggy.programmers.#.asd")
|
||||||
if mtok.Type != JSON {
|
if mtok.Type != JSON {
|
||||||
t.Fatal("expected %v, got %v", JSON, mtok.Type)
|
t.Fatal("expected %v, got %v", JSON, mtok.Type)
|
||||||
}
|
}
|
||||||
|
@ -210,72 +209,72 @@ func TestBasic(t *testing.T) {
|
||||||
t.Fatalf("expected 0, got %v", len(mtok.Array()))
|
t.Fatalf("expected 0, got %v", len(mtok.Array()))
|
||||||
}
|
}
|
||||||
|
|
||||||
if Get(basicJSON, "items.3.tags.#").Num != 3 {
|
if get(basicJSON, "items.3.tags.#").Num != 3 {
|
||||||
t.Fatalf("expected 3, got %v", Get(basicJSON, "items.3.tags.#").Num)
|
t.Fatalf("expected 3, got %v", get(basicJSON, "items.3.tags.#").Num)
|
||||||
}
|
}
|
||||||
if Get(basicJSON, "items.3.points.1.#").Num != 2 {
|
if get(basicJSON, "items.3.points.1.#").Num != 2 {
|
||||||
t.Fatalf("expected 2, got %v", Get(basicJSON, "items.3.points.1.#").Num)
|
t.Fatalf("expected 2, got %v", get(basicJSON, "items.3.points.1.#").Num)
|
||||||
}
|
}
|
||||||
if Get(basicJSON, "items.#").Num != 8 {
|
if get(basicJSON, "items.#").Num != 8 {
|
||||||
t.Fatalf("expected 6, got %v", Get(basicJSON, "items.#").Num)
|
t.Fatalf("expected 6, got %v", get(basicJSON, "items.#").Num)
|
||||||
}
|
}
|
||||||
if Get(basicJSON, "vals.#").Num != 4 {
|
if get(basicJSON, "vals.#").Num != 4 {
|
||||||
t.Fatalf("expected 4, got %v", Get(basicJSON, "vals.#").Num)
|
t.Fatalf("expected 4, got %v", get(basicJSON, "vals.#").Num)
|
||||||
}
|
}
|
||||||
if !Get(basicJSON, "name.last").Exists() {
|
if !get(basicJSON, "name.last").Exists() {
|
||||||
t.Fatal("expected true, got false")
|
t.Fatal("expected true, got false")
|
||||||
}
|
}
|
||||||
token = Get(basicJSON, "name.here")
|
token = get(basicJSON, "name.here")
|
||||||
if token.String() != "B\\\"R" {
|
if token.String() != "B\\\"R" {
|
||||||
t.Fatal("expecting 'B\\\"R'", "got", token.String())
|
t.Fatal("expecting 'B\\\"R'", "got", token.String())
|
||||||
}
|
}
|
||||||
token = Get(basicJSON, "arr.#")
|
token = get(basicJSON, "arr.#")
|
||||||
if token.String() != "6" {
|
if token.String() != "6" {
|
||||||
t.Fatal("expecting '6'", "got", token.String())
|
t.Fatal("expecting '6'", "got", token.String())
|
||||||
}
|
}
|
||||||
token = Get(basicJSON, "arr.3.hello")
|
token = get(basicJSON, "arr.3.hello")
|
||||||
if token.String() != "world" {
|
if token.String() != "world" {
|
||||||
t.Fatal("expecting 'world'", "got", token.String())
|
t.Fatal("expecting 'world'", "got", token.String())
|
||||||
}
|
}
|
||||||
_ = token.Value().(string)
|
_ = token.Value().(string)
|
||||||
token = Get(basicJSON, "name.first")
|
token = get(basicJSON, "name.first")
|
||||||
if token.String() != "tom" {
|
if token.String() != "tom" {
|
||||||
t.Fatal("expecting 'tom'", "got", token.String())
|
t.Fatal("expecting 'tom'", "got", token.String())
|
||||||
}
|
}
|
||||||
_ = token.Value().(string)
|
_ = token.Value().(string)
|
||||||
token = Get(basicJSON, "name.last")
|
token = get(basicJSON, "name.last")
|
||||||
if token.String() != "null" {
|
if token.String() != "null" {
|
||||||
t.Fatal("expecting 'null'", "got", token.String())
|
t.Fatal("expecting 'null'", "got", token.String())
|
||||||
}
|
}
|
||||||
if token.Value() != nil {
|
if token.Value() != nil {
|
||||||
t.Fatal("should be nil")
|
t.Fatal("should be nil")
|
||||||
}
|
}
|
||||||
token = Get(basicJSON, "age")
|
token = get(basicJSON, "age")
|
||||||
if token.String() != "100" {
|
if token.String() != "100" {
|
||||||
t.Fatal("expecting '100'", "got", token.String())
|
t.Fatal("expecting '100'", "got", token.String())
|
||||||
}
|
}
|
||||||
_ = token.Value().(float64)
|
_ = token.Value().(float64)
|
||||||
token = Get(basicJSON, "happy")
|
token = get(basicJSON, "happy")
|
||||||
if token.String() != "true" {
|
if token.String() != "true" {
|
||||||
t.Fatal("expecting 'true'", "got", token.String())
|
t.Fatal("expecting 'true'", "got", token.String())
|
||||||
}
|
}
|
||||||
_ = token.Value().(bool)
|
_ = token.Value().(bool)
|
||||||
token = Get(basicJSON, "immortal")
|
token = get(basicJSON, "immortal")
|
||||||
if token.String() != "false" {
|
if token.String() != "false" {
|
||||||
t.Fatal("expecting 'false'", "got", token.String())
|
t.Fatal("expecting 'false'", "got", token.String())
|
||||||
}
|
}
|
||||||
_ = token.Value().(bool)
|
_ = token.Value().(bool)
|
||||||
token = Get(basicJSON, "noop")
|
token = get(basicJSON, "noop")
|
||||||
if token.String() != `{"what is a wren?":"a bird"}` {
|
if token.String() != `{"what is a wren?":"a bird"}` {
|
||||||
t.Fatal("expecting '"+`{"what is a wren?":"a bird"}`+"'", "got", token.String())
|
t.Fatal("expecting '"+`{"what is a wren?":"a bird"}`+"'", "got", token.String())
|
||||||
}
|
}
|
||||||
_ = token.Value().(map[string]interface{})
|
_ = token.Value().(map[string]interface{})
|
||||||
|
|
||||||
if Get(basicJSON, "").Value() != nil {
|
if get(basicJSON, "").Value() != nil {
|
||||||
t.Fatal("should be nil")
|
t.Fatal("should be nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
Get(basicJSON, "vals.hello")
|
get(basicJSON, "vals.hello")
|
||||||
|
|
||||||
mm := Parse(basicJSON).Value().(map[string]interface{})
|
mm := Parse(basicJSON).Value().(map[string]interface{})
|
||||||
fn := mm["loggy"].(map[string]interface{})["programmers"].([]interface{})[1].(map[string]interface{})["firstName"].(string)
|
fn := mm["loggy"].(map[string]interface{})["programmers"].([]interface{})[1].(map[string]interface{})["firstName"].(string)
|
||||||
|
|
Loading…
Reference in New Issue