func equal(a json.Value, b json.Value) bool { switch x := a.(type) { case *json.Array: b, ok := b.(*json.Array) if !ok { return false } if len(x.Value) != len(b.Value) { return false } for i, item := range x.Value { if !equal(item, b.Value[i]) { return false } } return true case *json.Bool: b, ok := b.(*json.Bool) if !ok { return false } return x.Value == b.Value case *json.Number: switch b := b.(type) { case *json.Number: return x.Value == b.Value // XXX: comparing floating point numbers. case *json.Integer: return x.Value == float64(b.Value) // XXX: comparing floating point numbers. default: return false } case *json.Integer: switch b := b.(type) { case *json.Number: return float64(x.Value) == b.Value // XXX: comparing floating point numbers. case *json.Integer: return x.Value == b.Value default: return false } case *json.Null: _, ok := b.(*json.Null) if !ok { return false } return true case *json.Object: b, ok := b.(*json.Object) if !ok { return false } if len(x.Value) != len(b.Value) { return false } for i, item := range x.Value { if !equal(item, b.Find(i.Value)) { return false } } return true case *json.String: b, ok := b.(*json.String) if !ok { return false } return x.Value == b.Value default: return false } }