diff --git a/gjson.go b/gjson.go index c08c87a..1da1552 100644 --- a/gjson.go +++ b/gjson.go @@ -383,9 +383,13 @@ func (t Result) arrayOrMap(vc byte, valueize bool) (r arrayOrMapResult) { key = value } else { if valueize { - r.oi[key.Str] = value.Value() + if _, ok := r.oi[key.Str]; !ok { + r.oi[key.Str] = value.Value() + } } else { - r.o[key.Str] = value + if _, ok := r.o[key.Str]; !ok { + r.o[key.Str] = value + } } } count++ diff --git a/gjson_test.go b/gjson_test.go index 17af327..867fae6 100644 --- a/gjson_test.go +++ b/gjson_test.go @@ -1391,3 +1391,18 @@ func TestNumFloatString(t *testing.T) { t.Fatalf("expected '%v', got '%v'", "-9007199254740993", res.String()) } } + +func TestDuplicateKeys(t *testing.T) { + // this is vaild json according to the JSON spec + var json = `{"name": "Alex","name": "Peter"}` + if Parse(json).Get("name").String() != + Parse(json).Map()["name"].String() { + t.Fatalf("expected '%v', got '%v'", + Parse(json).Get("name").String(), + Parse(json).Map()["name"].String(), + ) + } + if !Valid(json) { + t.Fatal("should be valid") + } +}