Skip to content

Commit ed19441

Browse files
authored
Merge pull request #14 from quinnj/jq/get
Fix issue w/ string key on object get
2 parents 3841adf + 6f4fd99 commit ed19441

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

src/JSON3.jl

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,41 +46,81 @@ end
4646
return x, (i + 1, tapeidx)
4747
end
4848

49+
function Base.get(obj::Object, key::Symbol)
50+
for (k, v) in obj
51+
k == key && return v
52+
end
53+
throw(KeyError(key))
54+
end
55+
4956
function Base.get(obj::Object, key)
57+
k2 = Base.string(key)
58+
for (k, v) in obj
59+
String(k) == k2 && return v
60+
end
61+
throw(KeyError(key))
62+
end
63+
64+
function Base.get(obj::Object, ::Type{T}, key::Symbol)::T where {T}
5065
for (k, v) in obj
5166
k == key && return v
5267
end
5368
throw(KeyError(key))
5469
end
5570

5671
function Base.get(obj::Object, ::Type{T}, key)::T where {T}
72+
k2 = Base.string(key)
5773
for (k, v) in obj
58-
k == key && return v
74+
String(k) == k2 && return v
5975
end
6076
throw(KeyError(key))
6177
end
6278

79+
function Base.get(obj::Object, key::Symbol, default)
80+
for (k, v) in obj
81+
k == key && return v
82+
end
83+
return default
84+
end
85+
6386
function Base.get(obj::Object, key, default)
87+
k2 = Base.string(key)
88+
for (k, v) in obj
89+
String(k) == k2 && return v
90+
end
91+
return default
92+
end
93+
94+
function Base.get(obj::Object, ::Type{T}, key::Symbol, default::T)::T where {T}
6495
for (k, v) in obj
6596
k == key && return v
6697
end
6798
return default
6899
end
69100

70101
function Base.get(obj::Object, ::Type{T}, key, default::T)::T where {T}
102+
k2 = Base.string(key)
71103
for (k, v) in obj
72-
k == key && return v
104+
String(k) == k2 && return v
73105
end
74106
return default
75107
end
76108

77-
function Base.get(default::Base.Callable, obj::Object, key)
109+
function Base.get(default::Base.Callable, obj::Object, key::Symbol)
78110
for (k, v) in obj
79111
k == key && return v
80112
end
81113
return default()
82114
end
83115

116+
function Base.get(default::Base.Callable, obj::Object, key)
117+
k2 = Base.string(key)
118+
for (k, v) in obj
119+
String(k) == k2 && return v
120+
end
121+
return default()
122+
end
123+
84124
Base.propertynames(obj::Object) = collect(keys(obj))
85125

86126
Base.getproperty(obj::Object, prop::Symbol) = get(obj, prop)

test/runtests.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,4 +567,8 @@ d = Dict(uuid1() => i for i in 1:3)
567567
t = JSON3.write(d)
568568
@test JSON3.read(t, Dict{UUID, Int}) == d
569569

570+
# get issue
571+
obj = JSON3.read("{\"hey\":1}")
572+
@test get(obj, :hey) == get(obj, "hey") == get(obj, "hey", "") == get(()->"", obj, "hey")
573+
570574
end # @testset "JSON3"

0 commit comments

Comments
 (0)