Skip to content

Schema with $id / id does not have the id automatically cached for $ref resolution #710

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
FuhuXia opened this issue Jul 22, 2020 · 10 comments
Labels
Bug Something doesn't work the way it should.

Comments

@FuhuXia
Copy link

FuhuXia commented Jul 22, 2020

We have an all-in-one schema file, within which the property subOrganizationOf is referencing to its parent organization by "$ref": "#". But when validators.py hits this $ref, it tries to follow the url in the id and fetch external url https://project-open-data.cio.gov/v1.1/schema/organization.json. If the url is out-dated, it raise RefResolutionError(exc).

We are expecting validators stays with local definition, not relies on external url to validate this recursive self-referenced definition.

@Julian Julian added the Needs Simplification An issue which is in need of simplifying the example or issue being demonstrated for diagnosis. label Jul 31, 2020
@FuhuXia
Copy link
Author

FuhuXia commented Aug 2, 2020

sample.json:

{
  "organization": {
    "name": "Data.gov",
    "subOrganizationOf": {
      "name": "Technology Transformation Service"
    }
  }
}

sample.schema:

{
  "$schema": "http://json-schema.org/draft-04/schema#",

  "definitions": {
    "organization": {
      "id": "https://project-open-data.cio.gov/v1.1/schema/organization.json#",
      "required": [
        "name"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "subOrganizationOf": {
          "$ref": "#"
        }
      }
    }
  },

  "properties": {
    "organization": {"$ref": "#/definitions/organization"}
  }
}

Install jsonschema v3.2.0 and run the following command and this is what we see.
$ jsonschema -i sample.json sample.schema

  1. It is validated but jsonschema actually makes an (unnecessary?) external request to the URI string 'https://project-open-data.cio.gov/v1.1/schema/organization.json#'.
  2. If we change the URI string slightly, it gives error jsonschema.exceptions.RefResolutionError: HTTP Error 404: Not Found
  3. We can remove the id field from the schema, but then the name property requirement is not being validated any more.

We expect the jsonschema treats the id field as unique identifier, not follows its URI to fetch definition remotely, since the definition is in the local schema already.

@willson-chen
Copy link
Contributor

@FuhuXia The PR #717 could solve your problem.

@FuhuXia

This comment was marked as outdated.

@willson-chen

This comment was marked as outdated.

@willson-chen

This comment was marked as outdated.

@FuhuXia
Copy link
Author

FuhuXia commented Aug 17, 2020

@willson-chen Thank you for looking into it.

I always use latest release tagged v3.2.0 in my code, because I found current master branch has its own issue. For example, in my sample.json, if I change "name": "Technology Transformation Service" to "name123": "Technology Transformation Service", v3.2.0 will complain missing required name property, but master branch will overlook it.

@willson-chen
Copy link
Contributor

v3.2.0 will complain missing required name property, but master branch will overlook it.

@FuhuXia Yes, I also noticed this. It may take some time to look.

After I installed v3.2.0 and cherry-picked the three commits from the PR #717, then executed the command python -m jsonschema -i sample.json sample.schema, recursive self-referenced definition worked well. This time I invalidated the "id": "https://project-open-data.cio.gov/v1.1/schema/organization111.json#"

For your reference.

@willson-chen

This comment was marked as off-topic.

@Julian
Copy link
Member

Julian commented Nov 23, 2022

(Note to self):

This seems to still occur, a minimal-er reproducer is:

from jsonschema.validators import Draft4Validator, RefResolver
schema = {
    "$schema": "http://json-schema.org/draft-04/schema#",
    "definitions": {
        "organization": {
            "id": "https://project-open-data.cio.gov/v1.1/schema/organization.json#",
            "properties": {
                "subOrganizationOf": {"$ref": "#"}
            }
        }
    },
    "properties": {"organization": {"$ref": "#/definitions/organization"}}
}

instance = {"organization": {"subOrganizationOf": {}}}
resolver = RefResolver.from_schema(schema)
resolver.resolve_remote = lambda *args, **kwargs: breakpoint()
Draft4Validator(schema, resolver=resolver).validate(instance)

where we still hit resolve_remote even though the id we need is present.

Probably fixing this is dependent on having an API for flagging $defs / definitions (here in draft 4) and applicators as containing subschemas (and then discovering id / $ids within them).

@Julian Julian added Bug Something doesn't work the way it should. and removed Needs Simplification An issue which is in need of simplifying the example or issue being demonstrated for diagnosis. labels Nov 23, 2022
@Julian Julian changed the title Recursive self-referenced definition does not work locally Schema with $id / id does not have the id automatically cached for $ref resolution Nov 23, 2022
@Julian
Copy link
Member

Julian commented Feb 23, 2023

Hello there!

This, along with many many other $ref-related issues, is now finally being handled in #1049 with the introduction of a new referencing library which is fully compliant and has APIs which I hope are a lot easier to understand and customize.

The next release of jsonschema (v4.18.0) will contain a merged version of that PR, and should be released shortly in beta, and followed quickly by a regular release, assuming no critical issues are reported.

It looks from my testing like indeed this specific example works there! If you still care to, I'd love it if you tried out the beta once it is released, or certainly it'd be hugely helpful to immediately install the branch containing this work (https://github.com/python-jsonschema/jsonschema/tree/referencing) and confirm. You can in the interim find documentation for the change in a preview page here.

I'm going to close this given it indeed seems like it is addressed by #1049, but feel free to follow up with any comments. Sorry for the delay in getting to these, but hopefully this new release will bring lots of benefit!

@Julian Julian closed this as completed Feb 23, 2023
Julian added a commit that referenced this issue Jan 16, 2024
544f7c3d Merge pull request #712 from otto-ifak/main
9dad3ebe Add tests for enum with array of bool
589a0858 Merge pull request #706 from marksparkza/unevaluated-before-ref
64d5cab9 Merge pull request #710 from spacether/patch-1
418cdbd6 Removes idea folder
e0a9e066 Updates all other tests to mention grapheme/graphemes
69136952 Update minLength.json
4a2c61e8 Test unevaluatedItems|Properties before $ref

git-subtree-dir: json
git-subtree-split: 544f7c3df93b69f84f587b345f2835c380e43226
V02460 added a commit to V02460/jsonschema that referenced this issue Apr 29, 2025
REVERT: 83e866b4 Merge pull request python-jsonschema#763 from michaelmior/propertynames-const
REVERT: c5a9703f Merge pull request python-jsonschema#760 from OptimumCode/rfc3490-label-separator
REVERT: b4c09b65 Add tests for propertyNames with const/enum
REVERT: 4fa572d8 Move tests for rfc3490#3.1 into a separate test case
REVERT: ce9f68ca Add link to rfc and quote
REVERT: ad94cacc Add test cases for other valid label separators in IDN hostnames
REVERT: 39002ae7 Merge pull request python-jsonschema#762 from OptimumCode/rfc-html-link
REVERT: c8780535 Correct section anchor for rfc URL template
REVERT: 5f2ca7d6 Modify rfc url template to use html version
REVERT: 9c5d99b6 Merge pull request python-jsonschema#761 from OptimumCode/annotation-script-rfc-support
REVERT: 9563ce7b Correct rfc URL template - incorrect path pattern was used
REVERT: 961bfad0 Correct spec kind extraction from defined key. Continue on unkown URL kind
REVERT: e524505b Merge pull request python-jsonschema#759 from sirosen/hostname-format-reject-single-dot
REVERT: 4a3efd18 Add negative tests for "." for hostname formats
REVERT: 4ba013d5 Merge pull request python-jsonschema#747 from santhosh-tekuri/duration
REVERT: aa500e80 Merge pull request python-jsonschema#749 from json-schema-org/gregsdennis/json-everything-update
REVERT: eb8ce976 Merge pull request python-jsonschema#757 from ajevans99/main
REVERT: dcdae5c0 Merge pull request python-jsonschema#758 from sirosen/hostname-format-check-empty-string
REVERT: db21d21b Merge branch 'main' into hostname-format-check-empty-string
REVERT: 3fd78f04 Merge pull request python-jsonschema#1 from ajevans99/swift-json-schema
REVERT: 3cada3a9 Update README.md
REVERT: 82a07749 Merge pull request python-jsonschema#753 from json-schema-org/ether/fix-draft-locations
REVERT: a66d23d4  move draft-specific files to the dedicated dir for its draft
REVERT: 8ef15501 Merge pull request python-jsonschema#751 from big-andy-coates/format_tests_under_format
REVERT: fe1b1392 All format test cases should be under the `format` directory.
REVERT: b1ee90f6 json-everything moved to an org
REVERT: c00a3f94 test: duration format must start with P
REVERT: 9fc880bf Merge pull request python-jsonschema#740 from notEthan/format-pattern-control-char
REVERT: cbd48ea5 Simplify test of \a regex character to test directly against `pattern` schema
REVERT: d6f1010a Merge pull request python-jsonschema#746 from json-schema-org/annotations
REVERT: 4aec22c1 Revert the changes to additionalProperties.json.
REVERT: 2dc10671 Move the workflow step title.
REVERT: d9ce71ac May as well also show quotes in the annotation.
REVERT: 1b719a84 Pick the line after the description when attaching spec annotations.
REVERT: 08105151 Markdown is apparently not (yet?) supported in annotations.
REVERT: 81645773 Tidy up the specification annotator a bit.
REVERT: 38628b79 Make the spec URLs structure a bit easier for internal use.
REVERT: 4ebbeaf4 Merge branch 'Era-cell/main'
REVERT: e4bd7554 dumbness2 corrected
REVERT: d8ade402 inside run
REVERT: 57c7c869 changed install location
REVERT: 11f8e511 Added installing command in workflow
REVERT: f2766616 template library, url loads changes
REVERT: c2badb12 Merge pull request python-jsonschema#734 from OptimumCode/idn-hostname-arabic-indic-mixed
REVERT: dd9599a5 Merge branch 'main' of github.com:json-schema-org/JSON-Schema-Test-Suite
REVERT: 5b393436 add pr dependencies action
REVERT: 3a509007 Clear existin annotations on same PR
REVERT: 23674123 Cases for rfc and iso written separately
REVERT: 0b780b2c Corected yaml format
REVERT: 2b1ffb74 Best practices followed with optimized code
REVERT: e88a2da6 Works for all OS
REVERT: 7b40efe4 Base path for neighbouring file?
REVERT: 564e6957 Walking through all leaf files
REVERT: 7b84fb44 Merge branch 'main' of https://github.com/Era-cell/JSON-Schema-Test-Suite
REVERT: 891d0265 First workflow2
REVERT: 1c175195 regex correction
REVERT: 96f7683a Final correction2 - file names beautufied
REVERT: 5f050a07 Final correction1
REVERT: 77527b63 Stupidity corrected
REVERT: eb8fd760 Branch name specified
REVERT: 540a269b Log2
REVERT: f29d090a Wrong location sepcification
REVERT: 582e12be logging logs check
REVERT: df3bdecc path corrected
REVERT: c6b937ca Reading all jsons and spec urls added
REVERT: cbdd1755 change day2
REVERT: 54f3784a Merge pull request python-jsonschema#731 from MeastroZI/main
REVERT: 79dc92f1 TOKEN
REVERT: ce52852d Python file location changed
REVERT: 3558c2c6 Fake add to tests
REVERT: eecc7b7a Merge branch 'main' of https://github.com/Era-cell/JSON-Schema-Test-Suite
REVERT: 810d148a First workflow2
REVERT: 4eac02c7 First workflow
REVERT: ff29264c Merge pull request python-jsonschema#741 from harrel56/chore/tabs-to-spaces
REVERT: 9f39cf73 use spaces instead of tabs
REVERT: 2f3b5f7a Corrected replaced unevaluated with additoinalProperties
REVERT: 40bcb8b3 Corrected replaced unevaluated with additoinalProperties
REVERT: fa9224d7 Merge pull request python-jsonschema#732 from MeastroZI/main2
REVERT: 83bedd5c Changing descriptions
REVERT: 49f73429 fixing tests
REVERT: e6d6a081 adding more test cases
REVERT: 7e6c9be6 changing descriptions
REVERT: 959aca92 shifting test
REVERT: 605d7d78 Update propertyDependencies.json : test must be tests
REVERT: deb82824 test for dependentSchema and propertyDependencies with unevaluatedProperties and additionalProperties
REVERT: ea485124 Merge branch 'json-schema-org:main' into main
REVERT: 64a3e7b3 Merge pull request python-jsonschema#721 from json-schema-org/gregsdennis/dynamicref-skips-resources
REVERT: b9f14e64 Fix $schema in new new test
REVERT: 3d5048e8 Merge pull request python-jsonschema#733 from Era-cell/main
REVERT: 4ae14268 Add valid first character to avoid Bidi rule violation
REVERT: 2480edba Update additionalProperties.json formatting it
REVERT: 6aa79c0b Update additionalProperties.json formatting it
REVERT: 3e0139a5 Update tests/draft-next/additionalProperties.json
REVERT: 616240b0 Update tests/draft-next/additionalProperties.json
REVERT: c5f3e4ea Update tests/draft2020-12/propertyNames.json
REVERT: 964efb8e propertyNames doesn't affect additionalProperties, tests exist already for unevaluatedProps
REVERT: f08b884c Cases go under additional and unevaluated Properties
REVERT: 99864ff6 added tests for propertyNames with additionalProperties/unevaluatedProperties, also with specification property
REVERT: 3b5782b6 Update ref.json : changing $Ids
REVERT: 546b3561 test for $ref with $recursiveAnchor
REVERT: 57617f25 Merge pull request python-jsonschema#726 from Era-cell/main
REVERT: 51fc69cd meta data and property names constraints added, additional Items: string
REVERT: 9b169bed specification takes array of objects having section and quote
REVERT: 1362a8cc Pattern for para corrected
REVERT: 340116ec Schema of specification in much structured
REVERT: 003ac021 Test-schema including sub-schema for scpecification
REVERT: 50a20280 adding specification enhancement for additionalProperties
REVERT: 604f5f99 Drop tests of `$id` and `$anchor` that just test values against meta-schema `pattern` for those properties
REVERT: 9cd64ec9 come on man, save all the files
REVERT: f494440e use unique $id in optional tests, too
REVERT: 468453b0 use unique $id
REVERT: 9ec6d17e fix copy/paste error
REVERT: b284f423 add tests for $dynamicRef skipping over resources
REVERT: bf0360f4 add $recursiveAnchor to 2019-09 meta-schemas
REVERT: 0519d1f0 add $dynamicAnchor to meta-schemas
REVERT: b41167c7 Merge pull request python-jsonschema#714 from json-schema-org/more-not
REVERT: 4221a55a Add tests for not: {} schemas for all values.
REVERT: c499d1d2 Merge pull request python-jsonschema#713 from spacether/patch-1
REVERT: 24a471bd Update README.md
REVERT: 544f7c3d Merge pull request python-jsonschema#712 from otto-ifak/main
REVERT: 9dad3ebe Add tests for enum with array of bool
REVERT: 589a0858 Merge pull request python-jsonschema#706 from marksparkza/unevaluated-before-ref
REVERT: 64d5cab9 Merge pull request python-jsonschema#710 from spacether/patch-1
REVERT: 418cdbd6 Removes idea folder
REVERT: e0a9e066 Updates all other tests to mention grapheme/graphemes
REVERT: 217bf81b Merge pull request python-jsonschema#701 from json-schema-org/ether/dynamicRef-boolean
REVERT: 7a3d06d7 I remove a test that doesn't make sense.
REVERT: e8bf453d Move tests with ids in non-schemas to optional
REVERT: 69136952 Update minLength.json
REVERT: d545be21 Fix duplidate identifiers in recently added tests
REVERT: 4e9640c8 test when $dynamicRef references a boolean schema
REVERT: 3dab98ca Merge pull request python-jsonschema#705 from json-schema-org/gregsdennis/remove-contains-objects-tests
REVERT: 1d3aa495 remove more maxContains
REVERT: 4a2c61e8 Test unevaluatedItems|Properties before $ref
REVERT: ec553d76 contains no longer applies to objects
REVERT: 0433a2bf Merge pull request python-jsonschema#704 from big-andy-coates/clarify-format-requirements
REVERT: c685195f Merge pull request python-jsonschema#703 from big-andy-coates/link-to-creek-validator-comprison-site
REVERT: a46174b0 Add more detail around test runner requirements for `format` tests
REVERT: bb1de8a9 The site linked to is a data-driven functional and performance benchmark of JVM based validator implementations.
REVERT: d38ddd54 Merge pull request python-jsonschema#696 from jdesrosiers/unevaluated-dynamicref
REVERT: 5d0c05fa Fix copy/paste error
REVERT: 95fe6ca2 Merge pull request python-jsonschema#694 from json-schema-org/heterogeneous-additionalItems
REVERT: 9c88a0be Merge pull request python-jsonschema#697 from json-schema-org/gregsdennis/add-ref-into-known-nonapplicator
REVERT: 49222046 Add unevaluted with dynamic ref tests to draft-next
REVERT: 8ba1c90d Update unevaluted with dynamic ref to be more likely to catch errors
REVERT: fea2cf19 add tests for 2019 and 2020
REVERT: 6695ca38 add optional tests for `$ref`ing into known non-applicator keywords
REVERT: 2834c630 Add tests for unevaluated with dynamic reference
REVERT: cda4281c Merge pull request python-jsonschema#695 from json-schema-org/ether/clean-up-subSchemas
REVERT: 7b9f45c2 move subSchemas-defs.json to subSchemas.json
REVERT: e41ec0ec remove unused definition files
REVERT: 349c5a82 Merge pull request #692 from json-schema-org/ether/fix-subSchemas-refs
REVERT: 451baca4 Merge pull request python-jsonschema#670 from marksparkza/invalid-output-test
REVERT: b8da838a Add tests for heterogeneous arrays with additionalItems
REVERT: 6d7a44b7 fix subschema locations and their $refs
REVERT: a9a1e2e3 Merge pull request python-jsonschema#690 from skryukov/add-ipv4-mask-test
REVERT: ba52c48a Merge pull request python-jsonschema#689 from skryukov/add-schema-keyword-to-required-tests
REVERT: 69b53add Add a test case for ipv4 with netmask
REVERT: d0c602a7 Add $schema keyword to required tests
REVERT: 20f1f52c Merge pull request python-jsonschema#688 from spacether/feat_updates_python_exp_impl
REVERT: b087b3ca Updates implmentation
REVERT: 4ecd01f3 Merge pull request python-jsonschema#687 from swaeberle/check-single-label-idn-hostnames
REVERT: 732e7275 test single label IDN hostnames
REVERT: 202d5625 test: hostname format check fails on empty string
REVERT: ea0b63c9 Remove invalid output tests

git-subtree-dir: json
git-subtree-split: ab3924a663d2f9e6de844f464d185a70d881b9ed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Bug Something doesn't work the way it should.
Projects
None yet
Development

No branches or pull requests

3 participants