Skip to content

Commit b19169d

Browse files
committed
[bug] fix getsubschema handling of struct-based schema
1 parent 10c80a9 commit b19169d

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

jsonschema.m

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -854,38 +854,56 @@
854854
tok = tokens{i};
855855

856856
% Resolve $ref if present
857-
while isa(subschema, 'containers.Map') && isKey(subschema, '$ref')
858-
subschema = resolveref(subschema('$ref'), schema);
859-
if isempty(subschema)
860-
return
857+
if (isstruct(subschema))
858+
while isfield(subschema, encodevarname('$ref'))
859+
subschema = resolveref(subschema.(encodevarname('$ref')), schema);
860+
if isempty(subschema)
861+
return
862+
end
863+
end
864+
else
865+
while isKey(subschema, '$ref')
866+
subschema = resolveref(subschema('$ref'), schema);
867+
if isempty(subschema)
868+
return
869+
end
861870
end
862871
end
863872

864873
if tok(1) == '['
865874
% Array index -> use items schema
866-
if isa(subschema, 'containers.Map') && isKey(subschema, 'items')
875+
if isstruct(subschema) && isfield(subschema, 'items')
876+
subschema = subschema.items;
877+
if iscell(subschema) && ~isempty(subschema)
878+
subschema = subschema{1};
879+
end
880+
elseif (isa(subschema, 'containers.Map') || isa(subschema, 'dictionary')) && isKey(subschema, 'items')
867881
subschema = subschema('items');
868882
if iscell(subschema) && ~isempty(subschema)
869883
subschema = subschema{1};
870884
end
871885
else
872886
subschema = [];
873-
return
874887
end
875888
else
876889
% Property name (unescape \.)
877890
prop = strrep(tok, '\.', '.');
878-
if isa(subschema, 'containers.Map') && isKey(subschema, 'properties')
891+
if isstruct(subschema) && isfield(subschema, 'properties')
892+
props = subschema.properties;
893+
if isstruct(props) && isfield(props, prop)
894+
subschema = props.(prop);
895+
else
896+
subschema = [];
897+
end
898+
elseif (isa(subschema, 'containers.Map') || isa(subschema, 'dictionary')) && isKey(subschema, 'properties')
879899
props = subschema('properties');
880-
if isa(props, 'containers.Map') && isKey(props, prop)
900+
if (isa(subschema, 'containers.Map') || isa(subschema, 'dictionary')) && isKey(props, prop)
881901
subschema = props(prop);
882902
else
883903
subschema = [];
884-
return
885904
end
886905
else
887906
subschema = [];
888-
return
889907
end
890908
end
891909
end

0 commit comments

Comments
 (0)