diff --git a/common/json-schema-to-grammar.cpp b/common/json-schema-to-grammar.cpp index 737bae27c..58f3c2ae9 100644 --- a/common/json-schema-to-grammar.cpp +++ b/common/json-schema-to-grammar.cpp @@ -625,7 +625,7 @@ public: return _add_rule(rule_name, _build_object_rule( properties, required, name, - schema.contains("additionalProperties") ? schema["additionalProperties"] : json())); + schema.contains("additionalProperties") ? schema["additionalProperties"] : json::object())); } else if ((schema_type.is_null() || schema_type == "object") && schema.contains("allOf")) { std::unordered_set required; std::vector> properties; diff --git a/examples/json_schema_to_grammar.py b/examples/json_schema_to_grammar.py index 7d889c3fe..15631d53c 100755 --- a/examples/json_schema_to_grammar.py +++ b/examples/json_schema_to_grammar.py @@ -372,7 +372,10 @@ class SchemaConverter: ('additionalProperties' in schema and schema['additionalProperties'] is not True)): required = set(schema.get('required', [])) properties = list(schema.get('properties', {}).items()) - return self._add_rule(rule_name, self._build_object_rule(properties, required, name, schema.get('additionalProperties'))) + additional_properties = schema.get('additionalProperties', True) + if additional_properties is None: + additional_properties = True + return self._add_rule(rule_name, self._build_object_rule(properties, required, name, additional_properties)) elif schema_type in (None, 'object') and 'allOf' in schema: required = set() diff --git a/examples/server/public/json-schema-to-grammar.mjs b/examples/server/public/json-schema-to-grammar.mjs index cef11eab8..ded37c981 100644 --- a/examples/server/public/json-schema-to-grammar.mjs +++ b/examples/server/public/json-schema-to-grammar.mjs @@ -374,7 +374,11 @@ export class SchemaConverter { ('additionalProperties' in schema && schema.additionalProperties !== true))) { const required = new Set(schema.required || []); const properties = Object.entries(schema.properties ?? {}); - return this._addRule(ruleName, this._buildObjectRule(properties, required, name, schema.additionalProperties)); + let additionalProperties = schema.additionalProperties; + if (additionalProperties === undefined) { + additionalProperties = true; + } + return this._addRule(ruleName, this._buildObjectRule(properties, required, name, additionalProperties)); } else if ((schemaType === undefined || schemaType === 'object') && 'allOf' in schema) { const required = new Set(); const properties = []; diff --git a/tests/test-json-schema-to-grammar.cpp b/tests/test-json-schema-to-grammar.cpp index 052c08073..780e1932a 100755 --- a/tests/test-json-schema-to-grammar.cpp +++ b/tests/test-json-schema-to-grammar.cpp @@ -751,15 +751,31 @@ static void test_all(const std::string & lang, std::function