commit 0a431f0bd8e92c6fd9269b98464d23a9a5733206 Author: tretrauit Date: Fri Mar 15 19:02:03 2024 +0700 repo: init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad4a1f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,176 @@ +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +### Python Patch ### +# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration +poetry.toml + +# ruff +.ruff_cache/ + +# LSP config files +pyrightconfig.json + +# End of https://www.toptal.com/developers/gitignore/api/python diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f367b9c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 tretrauit + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..191bdc4 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# asjsonp + +Another simple (and stupid) JSON parser. + +## About + +This implements `.json` as described in RFC 4627, including support for all standard features and some extended features: + ++ Comment support ++ NaN, Infinity and -Infinity support (like the standard library) + +## Usage + +## Benchmark + +This is about 10x slower than Python `json` module, so don't expect anything from this module. + +## License + +[MIT](./LICENSE) diff --git a/asjsonp/__init__.py b/asjsonp/__init__.py new file mode 100755 index 0000000..ad5bcba --- /dev/null +++ b/asjsonp/__init__.py @@ -0,0 +1,4 @@ +from asjsonp.module import loads + + +__all__ = ["loads"] diff --git a/asjsonp/__main__.py b/asjsonp/__main__.py new file mode 100755 index 0000000..065d581 --- /dev/null +++ b/asjsonp/__main__.py @@ -0,0 +1,4 @@ +from asjsonp.module import loads + + +print(loads(open("test.json", "r").read())) diff --git a/asjsonp/module.py b/asjsonp/module.py new file mode 100755 index 0000000..df14fec --- /dev/null +++ b/asjsonp/module.py @@ -0,0 +1,125 @@ +__all__ = ["loads"] + + +def js2py(obj: str): + """ + Convert a JSON string to a Python object. + + This follows the simple approach defined in https://docs.python.org/3/library/json.html#encoders-and-decoders + """ + if obj == "true": + return True + elif obj == "false": + return False + elif obj == "null": + return None + elif obj == "NaN": + return float("nan") + elif obj == "Infinity": + return float("inf") + elif obj == "-Infinity": + return float("-inf") + elif obj.isnumeric(): + return int(obj) + elif obj.lower().replace(".", "").replace("e", "").replace("-", "").isnumeric(): + return float(obj) + else: + raise ValueError(f"Invalid JSON value: {obj}") + + +def loads(s: str): + result: list | dict = [] + first_open: bool = False + multiple_object_root: bool = False + parents: list = [] + current: dict | list = result + dict_current_key: str = None + dict_reading_value: str = None + # Set the value so Pylance can be happy. + current_text: str = "" + is_reading_string: bool = False + # Ignore the rest of the string line if it's a comment + prev_char: str = "" + ignore_rest: bool = False + + def handle_reading_value(): + nonlocal dict_reading_value + nonlocal dict_current_key + if dict_reading_value is not None and dict_reading_value.strip(): + value = js2py(dict_reading_value) + if dict_current_key: + current[dict_current_key] = value + else: + current.append(value) + dict_reading_value = None + dict_current_key = None + + for char in s: + if ignore_rest: + if char == "\n": + ignore_rest = False + elif is_reading_string: + # Handle string closing quote + if char == '"': + is_reading_string = False + if isinstance(current, dict): + if not dict_current_key: + dict_current_key = current_text + else: + current[dict_current_key] = current_text + dict_current_key = None + dict_reading_value = None + else: + current.append(current_text) + dict_reading_value = None + current_text = "" + else: + current_text += char + # Handle object & array types + elif char in ["{", "["]: + obj: dict | list + match char: + case "{": + if not first_open: + first_open = True + obj = {} + case "[": + if not first_open: + first_open = True + multiple_object_root = True + obj = [] + if isinstance(current, list): + current.append(obj) + elif isinstance(current, dict): + current[dict_current_key] = obj + parents.append(current) + # Reference to the current dict + if isinstance(current, list): + current = current[-1] + elif isinstance(current, dict): + current = current[dict_current_key] + dict_current_key = None + # Handle object and array closing bracket + elif char in ["}", "]"]: + # Switch reference back to the parent dict + handle_reading_value() + current = parents.pop() + # Handle string opening quote + elif char == '"': + is_reading_string = True + current_text = "" + elif char == ":": + dict_reading_value = "" + elif char == ",": + handle_reading_value() + elif char == "/": + if prev_char == "/": + ignore_rest = True + else: + if dict_reading_value is not None: + if char.strip(): + dict_reading_value += char + prev_char = char + if not multiple_object_root: + result = result[0] + return result diff --git a/benchmark/__main__.py b/benchmark/__main__.py new file mode 100644 index 0000000..03e5094 --- /dev/null +++ b/benchmark/__main__.py @@ -0,0 +1,33 @@ +import asjsonp +import json +import time +import sys + + +def test_asjsonp(text: str, count: int): + start = time.perf_counter_ns() + for _ in range(count): + asjsonp.loads(text) + end = time.perf_counter_ns() + print(f"asjsonp.loads: {(end - start) / (1000 ** 2)}ms") + + +def test_json(text: str, count: int): + start = time.perf_counter_ns() + for _ in range(count): + json.loads(text) + end = time.perf_counter_ns() + print(f"json.loads: {(end - start) / (1000 ** 2)}ms") + + +input_file = "./benchmark/data/api.opensource.org.json" +count = 1000 +for i, arg in enumerate(sys.argv[1:]): + if arg == "-i": + input_file = sys.argv[i + 2] + elif arg == "-c": + count = int(sys.argv[i + 2]) +text = open(input_file, "r").read() +print(f"Benchmarking file {input_file} with {count} iterations") +test_asjsonp(text, count) +test_json(text, count) diff --git a/benchmark/data/api.opensource.org.json b/benchmark/data/api.opensource.org.json new file mode 100644 index 0000000..6e812f2 --- /dev/null +++ b/benchmark/data/api.opensource.org.json @@ -0,0 +1 @@ +[{"id":"AAL","identifiers":[{"identifier":"AAL","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Attribution Assurance License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/AAL"}],"name":"Attribution Assurance License","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/AAL"}]},{"id":"AFL-3.0","identifiers":[{"identifier":"AFL-3.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Academic Free License (AFL)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/AFL-3.0"}],"name":"Academic Free License, Version 3.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/AFL-3.0"}]},{"id":"AGPL-3.0","identifiers":[{"identifier":"AGPL-3.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: GNU Affero General Public License v3","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/AGPL-3.0"}],"name":"GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPL-3.0)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/AGPL-3.0"}]},{"id":"APL-1.0","identifiers":[{"identifier":"APL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/APL-1.0"}],"name":"Adaptive Public License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","miscellaneous"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/APL-1.0"}]},{"id":"APSL-2.0","identifiers":[{"identifier":"APSL-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Apple Public Source License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/APSL-2.0"}],"name":"Apple Public Source License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/APSL-2.0"}]},{"id":"Apache-1.1","identifiers":[{"identifier":"Apache-1.1","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Apache-1.1"}],"name":"Apache Software License, Version 1.1","other_names":[],"superseded_by":"Apache-2.0","keywords":["discouraged","obsolete","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Apache-1.1"}]},{"id":"Apache-2.0","identifiers":[{"identifier":"Apache-2.0","scheme":"DEP5"},{"identifier":"Apache-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Apache Software License","scheme":"Trove"}],"links":[{"note":"tl;dr legal","url":"https://tldrlegal.com/license/apache-license-2.0-%28apache-2.0%29"},{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/Apache_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/Apache-2.0"}],"name":"Apache License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","popular","permissive"],"text":[{"media_type":"text/html","title":"HTML","url":"https://www.apache.org/licenses/LICENSE-2.0"}]},{"id":"Artistic-1.0","identifiers":[{"identifier":"Artistic-1.0","scheme":"DEP5"},{"identifier":"Artistic-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Artistic-1.0"}],"name":"Artistic License, Version 1.0","other_names":[],"superseded_by":"Artistic-2.0","keywords":["osi-approved","discouraged","obsolete"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Artistic-1.0"}]},{"id":"Artistic-2.0","identifiers":[{"identifier":"Artistic-2.0","scheme":"DEP5"},{"identifier":"Artistic-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Artistic License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Artistic-2.0"}],"name":"Artistic License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["miscellaneous","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Artistic-2.0"}]},{"id":"BSD-2","identifiers":[{"identifier":"BSD-2-clause","scheme":"DEP5"},{"identifier":"BSD-2-Clause","scheme":"SPDX"}],"links":[{"note":"Wikipedia Page","url":"https://en.wikipedia.org/wiki/BSD_licenses#2-clause"},{"note":"OSI Page","url":"https://opensource.org/licenses/BSD-2-Clause"}],"name":"BSD 2-Clause License","other_names":[{"name":"Simplified BSD License","note":null},{"name":"FreeBSD License","note":null}],"superseded_by":null,"keywords":["osi-approved","popular","permissive"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/BSD-2-Clause"}]},{"id":"BSD-3","identifiers":[{"identifier":"BSD-3-clause","scheme":"DEP5"},{"identifier":"BSD-3-Clause","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: BSD License","scheme":"Trove"}],"links":[{"note":"Wikipedia Page","url":"https://en.wikipedia.org/wiki/BSD_licenses#3-clause"},{"note":"OSI Page","url":"https://opensource.org/licenses/BSD-3-Clause"}],"name":"BSD 3-Clause License","other_names":[{"name":"Revised BSD License","note":null},{"name":"Modified BSD License","note":null},{"name":"New BSD License","note":null}],"superseded_by":null,"keywords":["osi-approved","popular","permissive"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/BSD-3-Clause"}]},{"id":"BSL-1.0","identifiers":[{"identifier":"BSL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/BSL-1.0"}],"name":"Boost Software License 1.0 (BSL-1.0)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/BSL-1.0"}]},{"id":"CATOSL-1.1","identifiers":[{"identifier":"CATOSL-1.1","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/CATOSL-1.1"}],"name":"Computer Associates Trusted Open Source License, Version 1.1","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CATOSL-1.1"}]},{"id":"CDDL-1.0","identifiers":[{"identifier":"CDDL-1.0","scheme":"DEP5"},{"identifier":"CDDL-1.0","scheme":"SPDX"}],"links":[{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/Common_Development_and_Distribution_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/CDDL-1.0"}],"name":"Common Development and Distribution License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","popular"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CDDL-1.0"}]},{"id":"CECILL-2.1","identifiers":[{"identifier":"License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/CECILL-2.1"}],"name":"Cea Cnrs Inria Logiciel Libre License, Version 2.1","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CECILL-2.1"}]},{"id":"CNRI-Python","identifiers":[{"identifier":"CNRI-Python","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Python License (CNRI Python License)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/CNRI-Python"}],"name":"CNRI portion of the multi-part Python License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CNRI-Python"}]},{"id":"CPAL-1.0","identifiers":[{"identifier":"CPAL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/CPAL-1.0"}],"name":"Common Public Attribution License Version 1.0 (CPAL-1.0)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CPAL-1.0"}]},{"id":"CPL-1.0","identifiers":[{"identifier":"CPL","scheme":"DEP5"},{"identifier":"CPL-1.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Common Public License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/CPL-1.0"}],"name":"Common Public License, Version 1.0","other_names":[],"superseded_by":"EPL-1.0","keywords":["discouraged","obsolete","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CPL-1.0"}]},{"id":"CUA-OPL-1.0","identifiers":[{"identifier":"CUA-OPL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/CUA-OPL-1.0"}],"name":"CUA Office Public License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CUA-OPL-1.0"}]},{"id":"CVW","identifiers":[{"identifier":"License :: OSI Approved :: MITRE Collaborative Virtual Workspace License (CVW)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/CVW"}],"name":"The MITRE Collaborative Virtual Workspace License","other_names":[],"superseded_by":null,"keywords":["discouraged","retired","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/CVW"}]},{"id":"ECL-1.0","identifiers":[{"identifier":"ECL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/ECL-1.0"}],"name":"Educational Community License, Version 1.0","other_names":[],"superseded_by":"ECL-2.0","keywords":["discouraged","obsolete","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/ECL-1.0"}]},{"id":"ECL-2.0","identifiers":[{"identifier":"ECL-2.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/ECL-2.0"}],"name":"Educational Community License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["special-purpose","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/ECL-2.0"}]},{"id":"EFL-1.0","identifiers":[{"identifier":"EFL-1.0","scheme":"DEP5"},{"identifier":"EFL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/EFL-1.0"}],"name":"The Eiffel Forum License, Version 1","other_names":[],"superseded_by":"EFL-2.0","keywords":["osi-approved","discouraged","obsolete"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/EFL-1.0"}]},{"id":"EFL-2.0","identifiers":[{"identifier":"EFL-2.0","scheme":"DEP5"},{"identifier":"EFL-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Eiffel Forum License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/EFL-2.0"}],"name":"Eiffel Forum License, Version 2","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/EFL-2.0"}]},{"id":"EPL-1.0","identifiers":[{"identifier":"EPL-1.0","scheme":"SPDX"}],"links":[{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/Eclipse_Public_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/EPL-1.0"}],"name":"Eclipse Public License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","popular"],"text":[{"media_type":"text/html","title":"HTML","url":"https://www.eclipse.org/legal/epl-v10.html"}]},{"id":"EUDatagrid","identifiers":[{"identifier":"EUDatagrid","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/EUDatagrid"}],"name":"EU DataGrid Software License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/EUDatagrid"}]},{"id":"EUPL-1.1","identifiers":[{"identifier":"EUPL-1.1","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: European Union Public Licence 1.1 (EUPL 1.1)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/EUPL-1.1"}],"name":"European Union Public License, Version 1.1","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/EUPL-1.1"}]},{"id":"Entessa","identifiers":[{"identifier":"Entessa","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Entessa"}],"name":"Entessa Public License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Entessa"}]},{"id":"Fair","identifiers":[{"identifier":"Fair","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Fair"}],"name":"Fair License (Fair)","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Fair"}]},{"id":"Frameworx-1.0","identifiers":[{"identifier":"Frameworx-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Frameworx-1.0"}],"name":"Frameworx License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Frameworx-1.0"}]},{"id":"GPL-2.0","identifiers":[{"identifier":"GPL-2.0","scheme":"DEP5"},{"identifier":"GPL-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: GNU General Public License v2 (GPLv2)","scheme":"Trove"}],"links":[{"note":"tl;dr legal","url":"https://tldrlegal.com/license/gnu-general-public-license-v2"},{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/GNU_General_Public_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/GPL-2.0"}],"name":"GNU General Public License, Version 2.0","other_names":[],"superseded_by":"GPL-3.0","keywords":["osi-approved","popular","copyleft"],"text":[{"media_type":"text/plain","title":"Plain Text","url":"https://www.gnu.org/licenses/gpl-2.0.txt"},{"media_type":"text/html","title":"HTML","url":"https://www.gnu.org/licenses/gpl-2.0-standalone.html"}]},{"id":"GPL-3.0","identifiers":[{"identifier":"GPL-3.0","scheme":"DEP5"},{"identifier":"GPL-3.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: GNU General Public License (GPL)","scheme":"Trove"},{"identifier":"License :: OSI Approved :: GNU General Public License v3 (GPLv3)","scheme":"Trove"}],"links":[{"note":"tl;dr legal","url":"https://tldrlegal.com/license/gnu-general-public-license-v3-%28gpl-3%29"},{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/GNU_General_Public_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/GPL-3.0"}],"name":"GNU General Public License, Version 3.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","popular","copyleft"],"text":[{"media_type":"text/plain","title":"Plain Text","url":"https://www.gnu.org/licenses/gpl-3.0.txt"},{"media_type":"text/html","title":"HTML","url":"https://www.gnu.org/licenses/gpl-3.0-standalone.html"}]},{"id":"HPND","identifiers":[{"identifier":"HPND","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/HPND"}],"name":"Historical Permission Notice and Disclaimer","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/HPND"}]},{"id":"IPA","identifiers":[{"identifier":"IPA","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/IPA"}],"name":"IPA Font License","other_names":[],"superseded_by":null,"keywords":["osi-approved","special-purpose"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/IPA"}]},{"id":"IPL-1.0","identifiers":[{"identifier":"IPL-1.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: IBM Public License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/IPL-1.0"}],"name":"IBM Public License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/IPL-1.0"}]},{"id":"ISC","identifiers":[{"identifier":"ISC","scheme":"DEP5"},{"identifier":"ISC","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: ISC License (ISCL)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/ISC"},{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/ISC_license"}],"name":"ISC License (ISC)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/ISC"}]},{"id":"Intel","identifiers":[{"identifier":"Intel","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Intel Open Source License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Intel"}],"name":"The Intel Open Source License","other_names":[],"superseded_by":null,"keywords":["discouraged","retired","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Intel"}]},{"id":"LGPL-2.1","identifiers":[{"identifier":"LGPL-2.1","scheme":"DEP5"},{"identifier":"LGPL-2.1","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: GNU Lesser General Public License v2 (LGPLv2)","scheme":"Trove"}],"links":[{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/LGPL-2.1"}],"name":"GNU Lesser General Public License, Version 2.1","other_names":[],"superseded_by":"LGPL-3.0","keywords":["osi-approved","popular","copyleft"],"text":[{"media_type":"text/plain","title":"Plain Text","url":"https://www.gnu.org/licenses/lgpl-2.1.txt"},{"media_type":"text/html","title":"HTML","url":"https://www.gnu.org/licenses/lgpl-2.1-standalone.html"}]},{"id":"LGPL-3.0","identifiers":[{"identifier":"LGPL-3.0","scheme":"DEP5"},{"identifier":"LGPL-3.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)","scheme":"Trove"},{"identifier":"License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)","scheme":"Trove"}],"links":[{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/GNU_Lesser_General_Public_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/LGPL-3.0"}],"name":"GNU Lesser General Public License, Version 3.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","popular","copyleft"],"text":[{"media_type":"text/plain","title":"Plain Text","url":"https://www.gnu.org/licenses/lgpl-3.0.txt"},{"media_type":"text/html","title":"HTML","url":"https://www.gnu.org/licenses/lgpl-3.0-standalone.html"}]},{"id":"LPL-1.0","identifiers":[{"identifier":"LPL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/LPL-1.0"}],"name":"Lucent Public License, Plan 9, Version 1.0","other_names":[],"superseded_by":"LPL-1.02","keywords":["osi-approved","discouraged","obsolete"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/LPL-1.0"}]},{"id":"LPL-1.02","identifiers":[{"identifier":"LPL-1.02","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/LPL-1.02"}],"name":"Lucent Public License, Version 1.02","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/LPL-1.02"}]},{"id":"LPPL-1.3c","identifiers":[{"identifier":"LPPL-1.3c","scheme":"DEP5"},{"identifier":"LPPL-1.3c","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/LPPL-1.3c"}],"name":"LaTeX Project Public License, Version 1.3c","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/LPPL-1.3c"}]},{"id":"LiLiQ-P-1.1","identifiers":[],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/LiLiQ-P-1.1"}],"name":"Licence Libre du Québec – Permissive, Version 1.1","other_names":[],"superseded_by":null,"keywords":["osi-approved","international","permissive"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/LiLiQ-P-1.1"}]},{"id":"LiLiQ-R+","identifiers":[],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/LiLiQ-Rplus-1.1"}],"name":"Licence Libre du Québec – Réciprocité forte, Version 1.1","other_names":[],"superseded_by":null,"keywords":["international","osi-approved","copyleft"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/LiLiQ-Rplus-1.1"}]},{"id":"LiLiQ-R-1.1","identifiers":[],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/LiLiQ-R-1.1"}],"name":"Licence Libre du Québec – Réciprocité, Version 1.1","other_names":[],"superseded_by":null,"keywords":["international","osi-approved","copyleft"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/LiLiQ-R-1.1"}]},{"id":"MIT","identifiers":[{"identifier":"MIT","scheme":"DEP5"},{"identifier":"Expat","scheme":"DEP5"},{"identifier":"MIT","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: MIT License","scheme":"Trove"}],"links":[{"note":"tl;dr legal","url":"https://tldrlegal.com/license/mit-license"},{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/MIT_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/mit"}],"name":"MIT/Expat License","other_names":[{"name":"MIT","note":"Because MIT has used many licenses for software, the Free Software Foundation considers MIT License ambiguous. The MIT License published on the OSI site is the same as the Expat License."},{"name":"Expat","note":"Because MIT has used many licenses for software, the Free Software Foundation considers MIT License ambiguous. The MIT License published on the OSI site is the same as the Expat License."}],"superseded_by":null,"keywords":["osi-approved","popular","permissive"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/mit"}]},{"id":"MPL-1.0","identifiers":[{"identifier":"MPL-1.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Mozilla Public License 1.0 (MPL)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/MPL-1.0"}],"name":"Mozilla Public License, Version 1.0","other_names":[],"superseded_by":"MPL-2.0","keywords":["osi-approved","discouraged","obsolete"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/MPL-1.0"}]},{"id":"MPL-1.1","identifiers":[{"identifier":"MPL-1.1","scheme":"DEP5"},{"identifier":"MPL-1.1","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Mozilla Public License 1.1 (MPL 1.1)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/MPL-1.1"}],"name":"Mozilla Public License, Version 1.1","other_names":[],"superseded_by":"MPL-2.0","keywords":["osi-approved","discouraged","obsolete"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/MPL-1.1"}]},{"id":"MPL-2.0","identifiers":[{"identifier":"MPL-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)","scheme":"Trove"}],"links":[{"note":"Wikipedia page","url":"https://en.wikipedia.org/wiki/MPL_License"},{"note":"OSI Page","url":"https://opensource.org/licenses/MPL-2.0"},{"note":"Mozilla Page","url":"https://www.mozilla.org/en-US/MPL/"}],"name":"Mozilla Public License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","popular","copyleft"],"text":[{"media_type":"text/html","title":"HTML","url":"https://www.mozilla.org/en-US/MPL/2.0/"}]},{"id":"MS-PL","identifiers":[{"identifier":"MS-PL","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/MS-PL"}],"name":"Microsoft Public License (MS-PL)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/MS-PL"}]},{"id":"MS-RL","identifiers":[{"identifier":"MS-RL","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/MS-RL"}],"name":"Microsoft Reciprocal License (MS-RL)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/MS-RL"}]},{"id":"MirOS","identifiers":[{"identifier":"MirOS","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/MirOS"}],"name":"The MirOS Licence (MirOS)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/MirOS"}]},{"id":"Motosoto","identifiers":[{"identifier":"Motosoto","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Motosoto License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Motosoto"}],"name":"Motosoto Open Source License, Version 0.9.1","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Motosoto"}]},{"id":"Multics","identifiers":[{"identifier":"Multics","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Multics"}],"name":"Multics License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Multics"}]},{"id":"NASA-1.3","identifiers":[{"identifier":"NASA-1.3","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/NASA-1.3"}],"name":"NASA Open Source Agreement, Version 1.3","other_names":[],"superseded_by":null,"keywords":["osi-approved","special-purpose"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/NASA-1.3"}]},{"id":"NCSA","identifiers":[{"identifier":"NCSA","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: University of Illinois/NCSA Open Source License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/NCSA"}],"name":"The University of Illinois/NCSA Open Source License","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/NCSA"}]},{"id":"NGPL","identifiers":[{"identifier":"NGPL","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Nethack General Public License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/NGPL"}],"name":"The Nethack General Public License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/NGPL"}]},{"id":"NPOSL-3.0","identifiers":[{"identifier":"NPOSL-3.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/NPOSL-3.0"}],"name":"The Non-Profit Open Software License, Version 3.0","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/NPOSL-3.0"}]},{"id":"NTP","identifiers":[{"identifier":"NTP","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/NTP"}],"name":"NTP License (NTP)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/NTP"}]},{"id":"Naumen","identifiers":[{"identifier":"Naumen","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Naumen"}],"name":"NAUMEN Public License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Naumen"}]},{"id":"Nokia","identifiers":[{"identifier":"Nokia","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Nokia Open Source License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Nokia"}],"name":"Nokia Open Source License, Version 1.0a","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Nokia"}]},{"id":"OCLC-2.0","identifiers":[{"identifier":"OCLC-2.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/OCLC-2.0"}],"name":"The OCLC Research Public License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/OCLC-2.0"}]},{"id":"OFL-1.1","identifiers":[{"identifier":"OFL-1.1","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/OFL-1.1"}],"name":"SIL Open Font License, Version 1.1","other_names":[],"superseded_by":null,"keywords":["osi-approved","special-purpose"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/OFL-1.1"}]},{"id":"OGTSL","identifiers":[{"identifier":"OGTSL","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Open Group Test Suite License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/OGTSL"}],"name":"The Open Group Test Suite License (OGTSL)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/OGTSL"}]},{"id":"OPL-2.1","identifiers":[],"links":[{"note":"OSET Foundation Page","url":"https://www.osetfoundation.org/public-license"},{"note":"OSI Page","url":"https://opensource.org/licenses/OPL-2.1"}],"name":"OSET Foundation Public License","other_names":[],"superseded_by":null,"keywords":["osi-approved","special-purpose"],"text":[{"media_type":"application/pdf","title":"PDF","url":"https://static1.squarespace.com/static/528d46a2e4b059766439fa8b/t/53236a37e4b0db70c9afdf14/1394829879761/OSETPublicLicense_v2.pdf"},{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/OPL-2.1"}]},{"id":"OSL-1.0","identifiers":[{"identifier":"OSL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/OSL-1.0"}],"name":"Open Software License, Version 1.0","other_names":[],"superseded_by":"OLS-3.0","keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/OSL-1.0"}]},{"id":"OSL-2.1","identifiers":[{"identifier":"OSL-2.1","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/OSL-2.1"}],"name":"Open Software License, Version 2.1","other_names":[],"superseded_by":"OLS-3.0","keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/OSL-2.1"}]},{"id":"OSL-3.0","identifiers":[{"identifier":"OSL-3.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/OSL-3.0"}],"name":"Open Software License, Version 3.0","other_names":[],"superseded_by":null,"keywords":["osi-approved","miscellaneous"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/OSL-3.0"}]},{"id":"PHP-3.0","identifiers":[{"identifier":"PHP-3.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/PHP-3.0"}],"name":"The PHP License, Version 3.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/PHP-3.0"}]},{"id":"PostgreSQL","identifiers":[{"identifier":"PostgreSQL","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/PostgreSQL"}],"name":"The PostgreSQL Licence","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/PostgreSQL"}]},{"id":"Python-2.0","identifiers":[{"identifier":"Python-2.0","scheme":"DEP5"},{"identifier":"Python-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Python Software Foundation License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Python-2.0"}],"name":"Python License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Python-2.0"}]},{"id":"QPL-1.0","identifiers":[{"identifier":"QPL-1.0","scheme":"DEP5"},{"identifier":"QPL-1.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Qt Public License (QPL)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/QPL-1.0"}],"name":"The Q Public License Version (QPL-1.0)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/QPL-1.0"}]},{"id":"RPL-1.1","identifiers":[{"identifier":"RPL-1.1","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/RPL-1.1"}],"name":"Reciprocal Public License, Version 1.1","other_names":[],"superseded_by":"RPL-1.5","keywords":["discouraged","obsolete","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/RPL-1.1"}]},{"id":"RPL-1.5","identifiers":[{"identifier":"RPL-1.5","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/RPL-1.5"}],"name":"Reciprocal Public License, Version 1.5","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/RPL-1.5"}]},{"id":"RPSL-1.0","identifiers":[{"identifier":"RPSL-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/RPSL-1.0"}],"name":"RealNetworks Public Source License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/RPSL-1.0"}]},{"id":"RSCPL","identifiers":[{"identifier":"RSCPL","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Ricoh Source Code Public License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/RSCPL"}],"name":"The Ricoh Source Code Public License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/RSCPL"}]},{"id":"SISSL","identifiers":[{"identifier":"SISSL","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Sun Industry Standards Source License (SISSL)","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/SISSL"}],"name":"Sun Industry Standards Source License","other_names":[],"superseded_by":null,"keywords":["discouraged","retired","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/SISSL"}]},{"id":"SPL-1.0","identifiers":[{"identifier":"SPL-1.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Sun Public License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/SPL-1.0"}],"name":"Sun Public License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/SPL-1.0"}]},{"id":"Simple-2.0","identifiers":[{"identifier":"SimPL-2.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Simple-2.0"}],"name":"Simple Public License (SimPL-2.0)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Simple-2.0"}]},{"id":"Sleepycat","identifiers":[{"identifier":"Sleepycat","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Sleepycat License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Sleepycat"}],"name":"The Sleepycat License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Sleepycat"}]},{"id":"UPL","identifiers":[],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/UPL"}],"name":"The Universal Permissive License (UPL), Version 1.0","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/UPL"}]},{"id":"VSL-1.0","identifiers":[{"identifier":"VSL-1.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Vovida Software License 1.0","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/VSL-1.0"}],"name":"The Vovida Software License, Version 1.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/VSL-1.0"}]},{"id":"W3C","identifiers":[{"identifier":"W3C","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: W3C License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/W3C"}],"name":"The W3C Software Notice and License","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/W3C"}]},{"id":"WXwindows","identifiers":[{"identifier":"WXwindows","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/WXwindows"}],"name":"The wxWindows Library Licence","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/WXwindows"}]},{"id":"Watcom-1.0","identifiers":[{"identifier":"Watcom-1.0","scheme":"SPDX"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Watcom-1.0"}],"name":"The Sybase Open Source Licence","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Watcom-1.0"}]},{"id":"Xnet","identifiers":[{"identifier":"Xnet","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: X.Net License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Xnet"}],"name":"The X.Net, Inc. License","other_names":[],"superseded_by":null,"keywords":["osi-approved","discouraged","redundant"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Xnet"}]},{"id":"ZPL-2.0","identifiers":[{"identifier":"Zope-2.0","scheme":"DEP5"},{"identifier":"ZPL-2.0","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: Zope Public License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/ZPL-2.0"}],"name":"The Zope Public License, Version 2.0","other_names":[],"superseded_by":null,"keywords":["discouraged","non-reusable","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/ZPL-2.0"}]},{"id":"Zlib","identifiers":[{"identifier":"Zlib","scheme":"DEP5"},{"identifier":"Zlib","scheme":"SPDX"},{"identifier":"License :: OSI Approved :: zlib/libpng License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/Zlib"}],"name":"The zlib/libpng License (Zlib)","other_names":[],"superseded_by":null,"keywords":["osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/Zlib"}]},{"id":"jabberpl","identifiers":[{"identifier":"License :: OSI Approved :: Jabber Open Source License","scheme":"Trove"}],"links":[{"note":"OSI Page","url":"https://opensource.org/licenses/jabberpl"}],"name":"Jabber Open Source License","other_names":[],"superseded_by":null,"keywords":["discouraged","retired","osi-approved"],"text":[{"media_type":"text/html","title":"HTML","url":"https://opensource.org/licenses/jabberpl"}]}] diff --git a/pyproject.toml b/pyproject.toml new file mode 100755 index 0000000..fee5e31 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,15 @@ +[tool.poetry] +name = "asjsonp" +version = "0.1.0" +description = "Another simple JSON parser" +authors = ["tretrauit "] +license = "MIT" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.12" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/test.json b/test.json new file mode 100755 index 0000000..3a1b5b7 --- /dev/null +++ b/test.json @@ -0,0 +1,27 @@ +{ + "object": { + "ubuntu": 16.04, + "gcc": "10", + "metadata": null, + "another-object": { + "oriented": "programming" + }, + "a": "a", + "array": [ + "sparkle", + "hanabi", + { + "chipi": "chapa" + }, + [[[[[[[[[["among us"]]]]]]]]]] + ] + }, + "cc": "gcc", + "glxgears": 123, + "chai": "bon", + "sparkle-sex": true, + "nan": NaN, + "-infinity": -Infinity, + "infinity": Infinity, + "e_number": 123e-123 +}