Skip to content

JSONDecodeError / RefResolutionError validating the issued field of a CSL item #447

Closed
@dhimmel

Description

@dhimmel

Greetings, I'm new to using this library and would like to validate objects based on the Citation Styles Language schema as part of manubot/manubot#47.

In the code snippet below with Python v3.6.6 and jsonschema v2.6.0, I'm getting a JSONDecodeError / RefResolutionError. If I remove the issued object of my CSL data, there are no errors. issued is defined in the schema as:

            "issued": {
                "$ref": "date-variable" 
            },

I saw in #343 and #371 that there may be some complexities with internal reference resolution. Not sure if that is the issue here.

Code snippet

import json
import jsonschema
import requests

# Load instance
csl = r'''\
[
  {
    "issued": {
      "date-parts": [
        [
          "2014",
          "07",
          "14"
        ]
      ]
    },
    "type": "report",
    "id": "nkzHjOdS"
  }
]
'''
csl = json.loads(csl)

# Load schema
url = 'https://github.com/citation-style-language/schema/raw/4846e02f0a775a8272819204379a4f8d7f45c16c/csl-data.json'
schema = requests.get(url).json()
jsonschema.Draft3Validator.check_schema(schema)
validator = jsonschema.Draft3Validator(schema)

# Validate
errors = list(validator.iter_errors(csl))

Stacktrace / error

---------------------------------------------------------------------------
JSONDecodeError                           Traceback (most recent call last)
~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in resolve_from_url(self, url)
    382             try:
--> 383                 document = self.resolve_remote(url)
    384             except Exception as exc:

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in resolve_remote(self, uri)
    468             if callable(requests.Response.json):
--> 469                 result = requests.get(uri).json()
    470             else:

~/anaconda3/lib/python3.6/site-packages/requests/models.py in json(self, **kwargs)
    895                     pass
--> 896         return complexjson.loads(self.text, **kwargs)
    897 

~/anaconda3/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
    353             parse_constant is None and object_pairs_hook is None and not kw):
--> 354         return _default_decoder.decode(s)
    355     if cls is None:

~/anaconda3/lib/python3.6/json/decoder.py in decode(self, s, _w)
    338         """
--> 339         obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    340         end = _w(s, end).end()

~/anaconda3/lib/python3.6/json/decoder.py in raw_decode(self, s, idx)
    356         except StopIteration as err:
--> 357             raise JSONDecodeError("Expecting value", s, err.value) from None
    358         return obj, end

JSONDecodeError: Expecting value: line 1 column 1 (char 0)

During handling of the above exception, another exception occurred:

RefResolutionError                        Traceback (most recent call last)
<ipython-input-4-45bebd6dd750> in <module>()
     29 
     30 # Validate
---> 31 errors = list(validator.iter_errors(csl))

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in iter_errors(self, instance, _schema)
    103 
    104                     errors = validator(self, v, instance, _schema) or ()
--> 105                     for error in errors:
    106                         # set details if not already set by the called fn
    107                         error._set(

~/anaconda3/lib/python3.6/site-packages/jsonschema/_validators.py in items(validator, items, instance, schema)
     53     if validator.is_type(items, "object"):
     54         for index, item in enumerate(instance):
---> 55             for error in validator.descend(item, items, path=index):
     56                 yield error
     57     else:

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in descend(self, instance, schema, path, schema_path)
    119 
    120         def descend(self, instance, schema, path=None, schema_path=None):
--> 121             for error in self.iter_errors(instance, schema):
    122                 if path is not None:
    123                     error.path.appendleft(path)

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in iter_errors(self, instance, _schema)
    103 
    104                     errors = validator(self, v, instance, _schema) or ()
--> 105                     for error in errors:
    106                         # set details if not already set by the called fn
    107                         error._set(

~/anaconda3/lib/python3.6/site-packages/jsonschema/_validators.py in properties_draft3(validator, properties, instance, schema)
    251                 subschema,
    252                 path=property,
--> 253                 schema_path=property,
    254             ):
    255                 yield error

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in descend(self, instance, schema, path, schema_path)
    119 
    120         def descend(self, instance, schema, path=None, schema_path=None):
--> 121             for error in self.iter_errors(instance, schema):
    122                 if path is not None:
    123                     error.path.appendleft(path)

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in iter_errors(self, instance, _schema)
    103 
    104                     errors = validator(self, v, instance, _schema) or ()
--> 105                     for error in errors:
    106                         # set details if not already set by the called fn
    107                         error._set(

~/anaconda3/lib/python3.6/site-packages/jsonschema/_validators.py in ref(validator, ref, instance, schema)
    210                 yield error
    211     else:
--> 212         scope, resolved = validator.resolver.resolve(ref)
    213         validator.resolver.push_scope(scope)
    214 

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in resolve(self, ref)
    373     def resolve(self, ref):
    374         url = self._urljoin_cache(self.resolution_scope, ref)
--> 375         return url, self._remote_cache(url)
    376 
    377     def resolve_from_url(self, url):

~/anaconda3/lib/python3.6/site-packages/jsonschema/validators.py in resolve_from_url(self, url)
    383                 document = self.resolve_remote(url)
    384             except Exception as exc:
--> 385                 raise RefResolutionError(exc)
    386 
    387         return self.resolve_fragment(document, fragment)

RefResolutionError: Expecting value: line 1 column 1 (char 0)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions