Coder Social home page Coder Social logo

Comments (5)

justin-tay avatar justin-tay commented on June 27, 2024

I will look into this. But by itself, "0" may be a valid iri reference if it can resolve to an absolute iri given a base iri.

I was hoping to avoid strictly validating $id because in particular the older drafts were more lax with what it could contain.

from json-schema-validator.

itineric avatar itineric commented on June 27, 2024

We just tried migration from 1.2.0 to 1.3.0 and tests were broken.
Maybe you can keep previous behaviour for ascending compatibility and run your new code on a configuration basis?

from json-schema-validator.

justin-tay avatar justin-tay commented on June 27, 2024

The specification uses the term SHOULD NOT instead of MUST NOT and attempting to perform the validation by ensuring that the $id can resolve to an absolute IRI causes one of the tests in the JSON Schema Test Suite to fail. This particular test seems to have been introduced fairly recently.

What I will likely do is introduce a configurable JsonSchemaIdValidator into the SchemaValidatorsConfig and retain the current lax validation as default. I will likely also write a strict implementation of the validator that can be used.

from json-schema-validator.

justin-tay avatar justin-tay commented on June 27, 2024

I have looked at the previous behavior and it looks like it is a semi strict about the $id value. If you loaded your schema from a classpath resource using a URI it doesn't throw in the previous version either. Loading it without a base URI causes it to throw in the previous version. I will try to replicate this previous behavior and set it as the default validator.

from json-schema-validator.

justin-tay avatar justin-tay commented on June 27, 2024

This will be fixed in the next version in the following manner

  • Adding a JsonSchemaIdValidator interface
  • Adding a DefaultJsonSchemaIdValidator implementation that implements the previous logic
  • The DefaultJsonSchemaIdValidator will be configured as default

This will make the behavior the same as 1.2.0.

That said if you really need the $id to be valid according to the spec, you would need to write your own implementation.

According to the spec

"$id" MUST NOT contain a non-empty fragment, and SHOULD NOT contain an empty fragment

The previous logic since 1.0.33 accepts non-empty fragment ids with the isUriFragmentWithNoContext check.

private URI combineCurrentUriWithIds(URI currentUri, JsonNode schemaNode) {
final String id = validationContext.resolveSchemaId(schemaNode);
if (id == null) {
return currentUri;
} else if (isUriFragmentWithNoContext(currentUri, id)) {
return null;
} else {
try {
return this.validationContext.getURIFactory().create(currentUri, id);
} catch (IllegalArgumentException e) {
throw new JsonSchemaException(ValidationMessage.of(ValidatorTypeCode.ID.getValue(), ValidatorTypeCode.ID, id, currentUri.toString()));
}
}
}

The following schema does not throw in 1.2.0 and before.

{
  "$id": "#0",
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

from json-schema-validator.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.