https://github.com/gazpachoking/jsonref
Automatically dereferences JSON references within a JSON document.
https://github.com/gazpachoking/jsonref
hacktoberfest
Last synced: about 1 year ago
JSON representation
Automatically dereferences JSON references within a JSON document.
- Host: GitHub
- URL: https://github.com/gazpachoking/jsonref
- Owner: gazpachoking
- License: mit
- Created: 2013-04-08T06:12:12.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2025-04-21T23:45:40.000Z (about 1 year ago)
- Last Synced: 2025-05-05T16:47:32.366Z (about 1 year ago)
- Topics: hacktoberfest
- Language: Python
- Homepage: http://jsonref.readthedocs.org
- Size: 182 KB
- Stars: 136
- Watchers: 3
- Forks: 29
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# jsonref
[](https://github.com/gazpachoking/jsonref/actions/workflows/test.yml?query=branch%3Amaster)
[](https://jsonref.readthedocs.io/en/latest/)
[](https://coveralls.io/r/gazpachoking/jsonref)
[](https://pypi.org/project/jsonref)
`jsonref` is a library for automatic dereferencing of [JSON
Reference](https://datatracker.ietf.org/doc/html/draft-pbryan-zyp-json-ref-03)
objects for Python (supporting Python 3.7+).
This library lets you use a data structure with JSON reference objects,
as if the references had been replaced with the referent data.
```python console
>>> from pprint import pprint
>>> import jsonref
>>> # An example json document
>>> json_str = """{"real": [1, 2, 3, 4], "ref": {"$ref": "#/real"}}"""
>>> data = jsonref.loads(json_str)
>>> pprint(data) # Reference is not evaluated until here
{'real': [1, 2, 3, 4], 'ref': [1, 2, 3, 4]}
```
# Features
- References are (optionally) evaluated lazily. Nothing is dereferenced until it is
used.
- Recursive references are supported, and create recursive python data
structures.
References objects are replaced by lazy lookup proxy objects to support lazy
dereferencing. They are almost completely transparent.
```python console
>>> data = jsonref.loads('{"real": [1, 2, 3, 4], "ref": {"$ref": "#/real"}}')
>>> # You can tell it is a proxy by using the type function
>>> type(data["real"]), type(data["ref"])
(, )
>>> # You have direct access to the referent data with the __subject__
>>> # attribute
>>> type(data["ref"].__subject__)
>>> # If you need to get at the reference object
>>> data["ref"].__reference__
{'$ref': '#/real'}
>>> # Other than that you can use the proxy just like the underlying object
>>> ref = data["ref"]
>>> isinstance(ref, list)
True
>>> data["real"] == ref
True
>>> ref.append(5)
>>> del ref[0]
>>> # Actions on the reference affect the real data (if it is mutable)
>>> pprint(data)
{'real': [2, 3, 4, 5], 'ref': [2, 3, 4, 5]}
```