Name | ssrjson JSON |
Version |
0.0.4
JSON |
| download |
home_page | None |
Summary | A high-performance Python JSON library that fully leverages modern processor capabilities. |
upload_time | 2025-09-06 12:53:24 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | None |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
<div align="center">
# **ssrJSON**
[](https://pypi.org/project/ssrjson/) [](https://pypi.org/project/ssrjson/)
A SIMD boosted high-performance and correct Python JSON parsing library that fully leverages modern processor capabilities.
</div>
## Introduction
ssrJSON is a Python JSON library that leverages modern hardware capabilities to achieve peak performance, implemented primarily in C with some components written in C++. It offers a fully compatible interface to Python’s standard `json` module, making it a seamless drop-in replacement, while providing exceptional performance for JSON encoding and decoding.
### How Fast is ssrJSON?
TL;DR: ssrJSON is faster than or nearly as fast as [orjson](https://github.com/ijl/orjson) (which announces itself as the fastest Python library for JSON) on most benchmark cases.
`ssrjson.dumps()` is about 4x-23x as fast as `json.dumps()` (Python3.13, x86-64, AVX2). `ssrjson.loads()` is about 2x-8x as fast as `json.loads()` for `str` input and is about 2x-8x as fast as `json.loads()` for `bytes` input (Python3.13, x86-64, AVX2). ssrJSON also provides `ssrjson.dumps_to_bytes()`, which encode Python objects directly to `bytes` object using SIMD instructions, similar to `orjson.dumps` but without calling slow CPython functions to do the UTF-8 encoding. Typically, ssrJSON is capable of processing non-ASCII strings directly without invoking any slow CPython UTF-8 encoding and decoding interfaces, eliminating the need for intermediate representations. Furthermore, the underlying implementation leverages SIMD acceleration to optimize this process. Details of benchmarking can be found in the [benchmark repository](https://github.com/Nambers/ssrJSON-benchmark). If you wish to run the benchmark tests yourself, you can execute the following commands:
```bash
pip install ssrjson-benchmark
python -m ssrjson_benchmark
```
This will generate a PDF report of the results. If you choose to, you may submit this report to the benchmark repository, allowing others to view the performance metrics of ssrJSON on your device.
### Design Goal
The design goal of ssrJSON is to provide a straightforward and highly compatible approach to replace the inherently slower Python standard JSON encoding and decoding implementation with a significantly more efficient and high-performance alternative. If your module exclusively utilizes `dumps` and `loads`, you can replace the current JSON implementation by importing ssrJSON as `import ssrjson as json`. To facilitate this, ssrJSON maintains compatibility with the argument formats of `json.dumps` and `json.loads`; however, it does not guarantee identical results to the standard JSON module, as many features are either intentionally omitted or not yet supported. For further information, please refer to the section [Features](#Features).
### Implementation Details
#### Encoding
The encoding performance of JSON libraries is not significantly limited by CPython, resulting in a very high potential maximum. During string encoding, ssrJSON extensively utilizes SIMD instructions to accelerate copying and conversion operations. The implementation of `dumps_to_bytes` also tackles challenges related to UTF-8 encoding. ssrJSON includes a comprehensive UTF-8 encoding algorithm optimized for all supported SIMD features as well as Python’s internal string representation format (PyCompactUnicodeObject). For floating-point number encoding, ssrJSON employs a slightly modified version of the [DragonBox](https://github.com/jk-jeon/dragonbox) algorithm, well-known for its high-performance floating-point conversions. When encoding integers, ssrJSON adapts the integer encoding approach from [yyjson](https://github.com/ibireme/yyjson), a highly optimized C-language JSON parsing library.
#### Decoding
The main performance bottleneck in JSON decoding is the speed of creating Python objects. To address this, ssrJSON adopts the short-key caching mechanism from orjson, which greatly reduces the overhead of creating Python string objects. For string handling, when the input is a `str` type, ssrJSON applies SIMD optimizations similar to those used in encoding, speeding up the decoding process. For `bytes` inputs, ssrJSON uses a customized version of yyjson’s string decoding algorithm. Beyond string handling, ssrJSON extensively leverages yyjson’s codebase, including its numeric decoding algorithms and core decoding logic.
### Current Status
ssrJSON is currently operational, although some potentially useful features have yet to be implemented. The development of ssrJSON is still actively ongoing, and your code contributions are highly appreciated.
## How To Install
Pre-built wheels are available on PyPI.
```
pip install ssrjson
```
Note: ssrJSON requires at least SSE4.2 on x86-64 ([x86-64-v2](https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels:~:text=their%20encryption%20extensions.-,Microarchitecture%20levels,-%5Bedit%5D)). ssrJSON does not work with Python implementations other than CPython. Currently supported CPython versions are 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.15. For Python >= 3.14, you need to build it from source.
### Build From Source
Since ssrJSON utilizes Clang's vector extensions, it requires compilation with Clang and cannot be compiled in GCC or pure MSVC environments. On Windows, `clang-cl` can be used for this purpose. Build can be easily done by the following commands (make sure CMake, Clang and Python are already installed)
```bash
# On Linux:
# export CC=clang
# export CXX=clang++
mkdir build
cmake -S . -B build # On Windows, configure with `cmake -T ClangCL`
cmake --build build
```
## Usage
### Basic
```python
>>> import ssrjson
>>> ssrjson.dumps({"key": "value"})
'{"key":"value"}'
>>> ssrjson.loads('{"key":"value"}')
{'key': 'value'}
>>> ssrjson.dumps_to_bytes({"key": "value"})
b'{"key":"value"}'
>>> ssrjson.loads(b'{"key":"value"}')
{'key': 'value'}
```
### Indent
ssrJSON only supports encoding with indent = 2, 4 or no indent (indent=0). When indent is used, a space is inserted between each key and value.
```python
>>> import ssrjson
>>> ssrjson.dumps({"a": "b", "c": {"d": True}, "e": [1, 2]})
'{"a":"b","c":{"d":true},"e":[1,2]}'
>>> print(ssrjson.dumps({"a": "b", "c": {"d": True}, "e": [1, 2]}, indent=2))
{
"a": "b",
"c": {
"d": true
},
"e": [
1,
2
]
}
>>> print(ssrjson.dumps({"a": "b", "c": {"d": True}, "e": [1, 2]}, indent=4))
{
"a": "b",
"c": {
"d": true
},
"e": [
1,
2
]
}
>>> ssrjson.dumps({"a": "b", "c": {"d": True}, "e": [1, 2]}, indent=3)
Traceback (most recent call last):
File "<python-input>", line 1, in <module>
ssrjson.dumps({"a": "b", "c": {"d": True}, "e": [1, 2]}, indent=3)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: indent must be 0, 2, or 4
```
### Other Arguments Supported by Python's json
Arguments like `ensure_ascii`, `parse_float` provided by `json` can be recognized but ignored *by design*.
The functionality of `object_hook` in `json.loads` will be supported in future.
## Features
Generally, `ssrjson.dumps` behaves like `json.dumps` with `ensure_ascii=False`, and `ssrjson.loads` behaves like `json.loads`. Below we explain some feature details of ssrJSON, which might be different from `json` module or other third-party JSON libraries.
### Strings
Code points within the range `[0xd800, 0xdfff]` cannot be represented in UTF-8 encoding, and the standard JSON specification typically prohibits the presence of such characters. However, since Python's `str` type is not encoded in UTF-8, ssrJSON aims to maintain compatibility with the Python json module's behavior, while other third-party Python JSON libraries may complain about this. In contrast, for the `dumps_to_bytes` function, which encodes output in UTF-8, the inclusion of these characters in the input is considered invalid.
```python
>>> s = chr(0xd800)
>>> (json.dumps(s, ensure_ascii=False) == '"' + s + '"', json.dumps(s, ensure_ascii=False))
(True, '"\ud800"')
>>> (ssrjson.dumps(s) == '"' + s + '"', ssrjson.dumps(s))
(True, '"\ud800"')
>>> ssrjson.dumps_to_bytes(s)
Traceback (most recent call last):
File "<python-input>", line 1, in <module>
ssrjson.dumps_to_bytes(s)
~~~~~~~~~~~~~~~~~~~~~~^^^
ssrjson.JSONEncodeError: Cannot encode unicode character in range [0xd800, 0xdfff] to utf-8
>>> json.loads(json.dumps(s, ensure_ascii=False)) == s
True
>>> ssrjson.loads(ssrjson.dumps(s)) == s
True
```
### Integers
`ssrjson.dumps` can only handle integers that can be expressed by either `uint64_t` or `int64_t` in C.
```python
>>> ssrjson.dumps(-(1<<63)-1)
Traceback (most recent call last):
File "<python-input>", line 1, in <module>
ssrjson.dumps(-(1<<63)-1)
~~~~~~~~~~~~~^^^^^^^^^^^^
ssrjson.JSONEncodeError: convert value to long long failed
>>> ssrjson.dumps(-(1<<63))
'-9223372036854775808'
>>> ssrjson.dumps((1<<64)-1)
'18446744073709551615'
>>> ssrjson.dumps(1<<64)
Traceback (most recent call last):
File "<python-input>", line 1, in <module>
ssrjson.dumps(1<<64)
~~~~~~~~~~~~~^^^^^^^
ssrjson.JSONEncodeError: convert value to unsigned long long failed
```
`ssrjson.loads` treats overflow integers as `float` objects.
```python
>>> ssrjson.loads('-9223372036854775809') # -(1<<63)-1
-9.223372036854776e+18
>>> ssrjson.loads('-9223372036854775808') # -(1<<63)
-9223372036854775808
>>> ssrjson.loads('18446744073709551615') # (1<<64)-1
18446744073709551615
>>> ssrjson.loads('18446744073709551616') # 1<<64
1.8446744073709552e+19
```
### Floats
For floating-point encoding, ssrJSON employs a slightly modified version of the [Dragonbox](https://github.com/jk-jeon/dragonbox) algorithm. Dragonbox is a highly efficient algorithm for converting floating-point to strings, typically producing output in scientific notation. ssrJSON has partially adapted this algorithm to enhance readability by outputting a more user-friendly format when no exponent is present.
Encoding and decoding `math.inf` are supported. `ssrjson.dumps` outputs the same result as `json.dumps`. The input of `ssrjson.loads` should be `"infinity"` with lower or upper cases (for each character), and cannot be `"inf"`.
```python
>>> json.dumps(math.inf)
'Infinity'
>>> ssrjson.dumps(math.inf)
'Infinity'
>>> ssrjson.loads("[infinity, Infinity, InFiNiTy, INFINITY]")
[inf, inf, inf, inf]
```
The case of `math.nan` is similar.
```python
>>> json.dumps(math.nan)
'NaN'
>>> ssrjson.dumps(math.nan)
'NaN'
>>> ssrjson.loads("[nan, Nan, NaN, NAN]")
[nan, nan, nan, nan]
```
## Limitations
Please note that ssrJSON is currently in the **beta stage** of development.
Several commonly used features are still under development, including serialization of subclasses of `str`, the `object_hook` functionality, and error location reporting during decoding. Additionally, ssrJSON will not support encoding or decoding of third-party data structures.
The ARM64 architecture is not yet supported but will be supported in the near future.
## Contributing
Contributions are welcome! Please open issues or submit pull requests for bug fixes, performance improvements, or new features. There will soon be a development documentation.
## License
This project is licensed under the MIT License. Licenses of other repositories are under [licenses](licenses) directory.
## Acknowledgments
We would like to express our gratitude to the outstanding libraries and their authors:
- [CPython](https://github.com/python/cpython)
- [yyjson](https://github.com/ibireme/yyjson): ssrJSON draws extensively from yyjson’s highly optimized implementations, including the core decoding logic, the decoding of bytes objects, the integer encoding and number decoding routines.
- [orjson](https://github.com/ijl/orjson): ssrJSON references parts of orjson’s SIMD-based ASCII string encoding and decoding algorithms, as well as the key caching mechanism. Additionally, ssrJSON utilizes orjson’s pytest framework for testing purposes.
- [Dragonbox](https://github.com/jk-jeon/dragonbox): ssrJSON employs Dragonbox for high-performance floating-point encoding.
- [xxHash](https://github.com/Cyan4973/xxHash): ssrJSON leverages xxHash to efficiently compute hash values for key caching.
Raw data
{
"_id": null,
"home_page": null,
"name": "ssrjson",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": null,
"author": null,
"author_email": "Antares <antares0982@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/79/ea/3f49eb0407813377960be6df71ad7c37bee08d542548735fa929c8b7b347/ssrjson-0.0.4.tar.gz",
"platform": null,
"description": "<div align=\"center\">\n\n# **ssrJSON**\n\n[](https://pypi.org/project/ssrjson/) [](https://pypi.org/project/ssrjson/)\n\nA SIMD boosted high-performance and correct Python JSON parsing library that fully leverages modern processor capabilities.\n\n</div>\n\n## Introduction\n\nssrJSON is a Python JSON library that leverages modern hardware capabilities to achieve peak performance, implemented primarily in C with some components written in C++. It offers a fully compatible interface to Python\u2019s standard `json` module, making it a seamless drop-in replacement, while providing exceptional performance for JSON encoding and decoding.\n\n### How Fast is ssrJSON?\n\nTL;DR: ssrJSON is faster than or nearly as fast as [orjson](https://github.com/ijl/orjson) (which announces itself as the fastest Python library for JSON) on most benchmark cases.\n\n`ssrjson.dumps()` is about 4x-23x as fast as `json.dumps()` (Python3.13, x86-64, AVX2). `ssrjson.loads()` is about 2x-8x as fast as `json.loads()` for `str` input and is about 2x-8x as fast as `json.loads()` for `bytes` input (Python3.13, x86-64, AVX2). ssrJSON also provides `ssrjson.dumps_to_bytes()`, which encode Python objects directly to `bytes` object using SIMD instructions, similar to `orjson.dumps` but without calling slow CPython functions to do the UTF-8 encoding. Typically, ssrJSON is capable of processing non-ASCII strings directly without invoking any slow CPython UTF-8 encoding and decoding interfaces, eliminating the need for intermediate representations. Furthermore, the underlying implementation leverages SIMD acceleration to optimize this process. Details of benchmarking can be found in the [benchmark repository](https://github.com/Nambers/ssrJSON-benchmark). If you wish to run the benchmark tests yourself, you can execute the following commands:\n\n```bash\npip install ssrjson-benchmark\npython -m ssrjson_benchmark\n```\n\nThis will generate a PDF report of the results. If you choose to, you may submit this report to the benchmark repository, allowing others to view the performance metrics of ssrJSON on your device.\n\n### Design Goal\n\nThe design goal of ssrJSON is to provide a straightforward and highly compatible approach to replace the inherently slower Python standard JSON encoding and decoding implementation with a significantly more efficient and high-performance alternative. If your module exclusively utilizes `dumps` and `loads`, you can replace the current JSON implementation by importing ssrJSON as `import ssrjson as json`. To facilitate this, ssrJSON maintains compatibility with the argument formats of `json.dumps` and `json.loads`; however, it does not guarantee identical results to the standard JSON module, as many features are either intentionally omitted or not yet supported. For further information, please refer to the section [Features](#Features).\n\n### Implementation Details\n\n#### Encoding\n\nThe encoding performance of JSON libraries is not significantly limited by CPython, resulting in a very high potential maximum. During string encoding, ssrJSON extensively utilizes SIMD instructions to accelerate copying and conversion operations. The implementation of `dumps_to_bytes` also tackles challenges related to UTF-8 encoding. ssrJSON includes a comprehensive UTF-8 encoding algorithm optimized for all supported SIMD features as well as Python\u2019s internal string representation format (PyCompactUnicodeObject). For floating-point number encoding, ssrJSON employs a slightly modified version of the [DragonBox](https://github.com/jk-jeon/dragonbox) algorithm, well-known for its high-performance floating-point conversions. When encoding integers, ssrJSON adapts the integer encoding approach from [yyjson](https://github.com/ibireme/yyjson), a highly optimized C-language JSON parsing library.\n\n#### Decoding\n\nThe main performance bottleneck in JSON decoding is the speed of creating Python objects. To address this, ssrJSON adopts the short-key caching mechanism from orjson, which greatly reduces the overhead of creating Python string objects. For string handling, when the input is a `str` type, ssrJSON applies SIMD optimizations similar to those used in encoding, speeding up the decoding process. For `bytes` inputs, ssrJSON uses a customized version of yyjson\u2019s string decoding algorithm. Beyond string handling, ssrJSON extensively leverages yyjson\u2019s codebase, including its numeric decoding algorithms and core decoding logic.\n\n### Current Status\n\nssrJSON is currently operational, although some potentially useful features have yet to be implemented. The development of ssrJSON is still actively ongoing, and your code contributions are highly appreciated.\n\n## How To Install\n\nPre-built wheels are available on PyPI.\n\n```\npip install ssrjson\n```\n\nNote: ssrJSON requires at least SSE4.2 on x86-64 ([x86-64-v2](https://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels:~:text=their%20encryption%20extensions.-,Microarchitecture%20levels,-%5Bedit%5D)). ssrJSON does not work with Python implementations other than CPython. Currently supported CPython versions are 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.15. For Python >= 3.14, you need to build it from source.\n\n### Build From Source\n\nSince ssrJSON utilizes Clang's vector extensions, it requires compilation with Clang and cannot be compiled in GCC or pure MSVC environments. On Windows, `clang-cl` can be used for this purpose. Build can be easily done by the following commands (make sure CMake, Clang and Python are already installed)\n\n```bash\n# On Linux:\n# export CC=clang\n# export CXX=clang++\nmkdir build\ncmake -S . -B build # On Windows, configure with `cmake -T ClangCL`\ncmake --build build\n```\n\n## Usage\n\n### Basic\n\n```python\n>>> import ssrjson\n>>> ssrjson.dumps({\"key\": \"value\"})\n'{\"key\":\"value\"}'\n>>> ssrjson.loads('{\"key\":\"value\"}')\n{'key': 'value'}\n>>> ssrjson.dumps_to_bytes({\"key\": \"value\"})\nb'{\"key\":\"value\"}'\n>>> ssrjson.loads(b'{\"key\":\"value\"}')\n{'key': 'value'}\n```\n\n### Indent\n\nssrJSON only supports encoding with indent = 2, 4 or no indent (indent=0). When indent is used, a space is inserted between each key and value.\n\n```python\n>>> import ssrjson\n>>> ssrjson.dumps({\"a\": \"b\", \"c\": {\"d\": True}, \"e\": [1, 2]})\n'{\"a\":\"b\",\"c\":{\"d\":true},\"e\":[1,2]}'\n>>> print(ssrjson.dumps({\"a\": \"b\", \"c\": {\"d\": True}, \"e\": [1, 2]}, indent=2))\n{\n \"a\": \"b\",\n \"c\": {\n \"d\": true\n },\n \"e\": [\n 1,\n 2\n ]\n}\n>>> print(ssrjson.dumps({\"a\": \"b\", \"c\": {\"d\": True}, \"e\": [1, 2]}, indent=4))\n{\n \"a\": \"b\",\n \"c\": {\n \"d\": true\n },\n \"e\": [\n 1,\n 2\n ]\n}\n>>> ssrjson.dumps({\"a\": \"b\", \"c\": {\"d\": True}, \"e\": [1, 2]}, indent=3)\nTraceback (most recent call last):\n File \"<python-input>\", line 1, in <module>\n ssrjson.dumps({\"a\": \"b\", \"c\": {\"d\": True}, \"e\": [1, 2]}, indent=3)\n ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nValueError: indent must be 0, 2, or 4\n```\n\n### Other Arguments Supported by Python's json\n\nArguments like `ensure_ascii`, `parse_float` provided by `json` can be recognized but ignored *by design*.\n\nThe functionality of `object_hook` in `json.loads` will be supported in future.\n\n## Features\n\nGenerally, `ssrjson.dumps` behaves like `json.dumps` with `ensure_ascii=False`, and `ssrjson.loads` behaves like `json.loads`. Below we explain some feature details of ssrJSON, which might be different from `json` module or other third-party JSON libraries.\n\n### Strings\n\nCode points within the range `[0xd800, 0xdfff]` cannot be represented in UTF-8 encoding, and the standard JSON specification typically prohibits the presence of such characters. However, since Python's `str` type is not encoded in UTF-8, ssrJSON aims to maintain compatibility with the Python json module's behavior, while other third-party Python JSON libraries may complain about this. In contrast, for the `dumps_to_bytes` function, which encodes output in UTF-8, the inclusion of these characters in the input is considered invalid.\n\n```python\n>>> s = chr(0xd800)\n>>> (json.dumps(s, ensure_ascii=False) == '\"' + s + '\"', json.dumps(s, ensure_ascii=False))\n(True, '\"\\ud800\"')\n>>> (ssrjson.dumps(s) == '\"' + s + '\"', ssrjson.dumps(s))\n(True, '\"\\ud800\"')\n>>> ssrjson.dumps_to_bytes(s)\nTraceback (most recent call last):\n File \"<python-input>\", line 1, in <module>\n ssrjson.dumps_to_bytes(s)\n ~~~~~~~~~~~~~~~~~~~~~~^^^\nssrjson.JSONEncodeError: Cannot encode unicode character in range [0xd800, 0xdfff] to utf-8\n>>> json.loads(json.dumps(s, ensure_ascii=False)) == s\nTrue\n>>> ssrjson.loads(ssrjson.dumps(s)) == s\nTrue\n```\n\n### Integers\n\n`ssrjson.dumps` can only handle integers that can be expressed by either `uint64_t` or `int64_t` in C.\n\n```python\n>>> ssrjson.dumps(-(1<<63)-1)\nTraceback (most recent call last):\n File \"<python-input>\", line 1, in <module>\n ssrjson.dumps(-(1<<63)-1)\n ~~~~~~~~~~~~~^^^^^^^^^^^^\nssrjson.JSONEncodeError: convert value to long long failed\n>>> ssrjson.dumps(-(1<<63))\n'-9223372036854775808'\n>>> ssrjson.dumps((1<<64)-1)\n'18446744073709551615'\n>>> ssrjson.dumps(1<<64)\nTraceback (most recent call last):\n File \"<python-input>\", line 1, in <module>\n ssrjson.dumps(1<<64)\n ~~~~~~~~~~~~~^^^^^^^\nssrjson.JSONEncodeError: convert value to unsigned long long failed\n```\n\n`ssrjson.loads` treats overflow integers as `float` objects.\n\n```python\n>>> ssrjson.loads('-9223372036854775809') # -(1<<63)-1\n-9.223372036854776e+18\n>>> ssrjson.loads('-9223372036854775808') # -(1<<63)\n-9223372036854775808\n>>> ssrjson.loads('18446744073709551615') # (1<<64)-1\n18446744073709551615\n>>> ssrjson.loads('18446744073709551616') # 1<<64\n1.8446744073709552e+19\n```\n\n### Floats\n\nFor floating-point encoding, ssrJSON employs a slightly modified version of the [Dragonbox](https://github.com/jk-jeon/dragonbox) algorithm. Dragonbox is a highly efficient algorithm for converting floating-point to strings, typically producing output in scientific notation. ssrJSON has partially adapted this algorithm to enhance readability by outputting a more user-friendly format when no exponent is present.\n\nEncoding and decoding `math.inf` are supported. `ssrjson.dumps` outputs the same result as `json.dumps`. The input of `ssrjson.loads` should be `\"infinity\"` with lower or upper cases (for each character), and cannot be `\"inf\"`.\n\n```python\n>>> json.dumps(math.inf)\n'Infinity'\n>>> ssrjson.dumps(math.inf)\n'Infinity'\n>>> ssrjson.loads(\"[infinity, Infinity, InFiNiTy, INFINITY]\")\n[inf, inf, inf, inf]\n```\n\nThe case of `math.nan` is similar.\n\n```python\n>>> json.dumps(math.nan)\n'NaN'\n>>> ssrjson.dumps(math.nan)\n'NaN'\n>>> ssrjson.loads(\"[nan, Nan, NaN, NAN]\")\n[nan, nan, nan, nan]\n```\n\n## Limitations\n\nPlease note that ssrJSON is currently in the **beta stage** of development.\n\nSeveral commonly used features are still under development, including serialization of subclasses of `str`, the `object_hook` functionality, and error location reporting during decoding. Additionally, ssrJSON will not support encoding or decoding of third-party data structures.\n\nThe ARM64 architecture is not yet supported but will be supported in the near future.\n\n## Contributing\n\nContributions are welcome! Please open issues or submit pull requests for bug fixes, performance improvements, or new features. There will soon be a development documentation.\n\n## License\n\nThis project is licensed under the MIT License. Licenses of other repositories are under [licenses](licenses) directory.\n\n## Acknowledgments\n\nWe would like to express our gratitude to the outstanding libraries and their authors:\n\n- [CPython](https://github.com/python/cpython)\n- [yyjson](https://github.com/ibireme/yyjson): ssrJSON draws extensively from yyjson\u2019s highly optimized implementations, including the core decoding logic, the decoding of bytes objects, the integer encoding and number decoding routines.\n- [orjson](https://github.com/ijl/orjson): ssrJSON references parts of orjson\u2019s SIMD-based ASCII string encoding and decoding algorithms, as well as the key caching mechanism. Additionally, ssrJSON utilizes orjson\u2019s pytest framework for testing purposes.\n- [Dragonbox](https://github.com/jk-jeon/dragonbox): ssrJSON employs Dragonbox for high-performance floating-point encoding.\n- [xxHash](https://github.com/Cyan4973/xxHash): ssrJSON leverages xxHash to efficiently compute hash values for key caching.\n\n",
"bugtrack_url": null,
"license": null,
"summary": "A high-performance Python JSON library that fully leverages modern processor capabilities.",
"version": "0.0.4",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "a4e0ba7f99d7a0ed5594b886500144236c366eb178864198bb9b4341eca5fa8b",
"md5": "01cd88a6347cc220b2e8622662e74580",
"sha256": "a28c64bac2bf772f25356ae5381f89ad6b99f04d1458a05ff8ebbe987068e6b7"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "01cd88a6347cc220b2e8622662e74580",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 677928,
"upload_time": "2025-09-06T12:53:10",
"upload_time_iso_8601": "2025-09-06T12:53:10.615323Z",
"url": "https://files.pythonhosted.org/packages/a4/e0/ba7f99d7a0ed5594b886500144236c366eb178864198bb9b4341eca5fa8b/ssrjson-0.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5258d3aaa2c04449875bfd52b8758ce3f9d53f33d402fc723d8df172ba8f1aac",
"md5": "6369050a6384f8ef110bf24930c5b268",
"sha256": "8326cdc02cf4b1e81bdd11646cb78297378a54f26123a0515d7fe2bbf78cc201"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "6369050a6384f8ef110bf24930c5b268",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.9",
"size": 632914,
"upload_time": "2025-09-06T12:53:12",
"upload_time_iso_8601": "2025-09-06T12:53:12.261910Z",
"url": "https://files.pythonhosted.org/packages/52/58/d3aaa2c04449875bfd52b8758ce3f9d53f33d402fc723d8df172ba8f1aac/ssrjson-0.0.4-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f69f0fe6b5ba24940cf8a73bff8229ad04d2575b6ea68b0f5dccdee27853ff45",
"md5": "f9ee04938b047b6d267a284db0e3b085",
"sha256": "47e9814291ef0852112824fa62337b61561ff153ec9d7afd92e8241388155f00"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "f9ee04938b047b6d267a284db0e3b085",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 677858,
"upload_time": "2025-09-06T12:53:13",
"upload_time_iso_8601": "2025-09-06T12:53:13.832239Z",
"url": "https://files.pythonhosted.org/packages/f6/9f/0fe6b5ba24940cf8a73bff8229ad04d2575b6ea68b0f5dccdee27853ff45/ssrjson-0.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9f83b6277c5aaabc1da17e6aec48e93f31881e0ce671088fb50d650b4d378de8",
"md5": "14506dd2784917585e41b810c6cabfd2",
"sha256": "5b5f51f02027623b74a53ca012c464760cd4e89f6cfc36c8146137104ab3c0ce"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "14506dd2784917585e41b810c6cabfd2",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.9",
"size": 632820,
"upload_time": "2025-09-06T12:53:15",
"upload_time_iso_8601": "2025-09-06T12:53:15.246656Z",
"url": "https://files.pythonhosted.org/packages/9f/83/b6277c5aaabc1da17e6aec48e93f31881e0ce671088fb50d650b4d378de8/ssrjson-0.0.4-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dc2d3066ecd30aad4dc3bd662c2d8f73012153f75ea1acc2baf0be0a234860f0",
"md5": "9044450bc10d758cad7c1bae71798ee6",
"sha256": "75b9f9e60ea10deaa3ca070791ce6fcb1e4f4c39a218e227ce44759110359e54"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "9044450bc10d758cad7c1bae71798ee6",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 679706,
"upload_time": "2025-09-06T12:53:16",
"upload_time_iso_8601": "2025-09-06T12:53:16.825873Z",
"url": "https://files.pythonhosted.org/packages/dc/2d/3066ecd30aad4dc3bd662c2d8f73012153f75ea1acc2baf0be0a234860f0/ssrjson-0.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "af3f7d9082979e6ccaa34bef8355f4d29a2f5c16ece9bb84bfdacd4d4f2a22e7",
"md5": "59c3f129ba13eeabb72b9c4d8aace182",
"sha256": "38f4c39965be17062c94e0190efe3df694b120a8288c5035a80aca8120cfc7d9"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "59c3f129ba13eeabb72b9c4d8aace182",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.9",
"size": 635517,
"upload_time": "2025-09-06T12:53:18",
"upload_time_iso_8601": "2025-09-06T12:53:18.322523Z",
"url": "https://files.pythonhosted.org/packages/af/3f/7d9082979e6ccaa34bef8355f4d29a2f5c16ece9bb84bfdacd4d4f2a22e7/ssrjson-0.0.4-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5aec71b8a08653624207daa241fbe5e233bb406e1254c30cc40177f95a9e2056",
"md5": "fb234c0d8a2a1fd4b0910467eadfd208",
"sha256": "45571e83bc8337f7f2cfd3f3e4347d1c7ddb599f6041190a7aca242721018a05"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl",
"has_sig": false,
"md5_digest": "fb234c0d8a2a1fd4b0910467eadfd208",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 681045,
"upload_time": "2025-09-06T12:53:19",
"upload_time_iso_8601": "2025-09-06T12:53:19.820256Z",
"url": "https://files.pythonhosted.org/packages/5a/ec/71b8a08653624207daa241fbe5e233bb406e1254c30cc40177f95a9e2056/ssrjson-0.0.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "bad5fb65d5a059da93e578dadebc2b7041f8b756ce464c056f7a5dfd3515346e",
"md5": "db8559f3f2cb544349774e5077574a12",
"sha256": "d8f3ebd033479839583f9a8f9246a593ce96fe4293536c4f8020167dcc1b32bb"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "db8559f3f2cb544349774e5077574a12",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.9",
"size": 635984,
"upload_time": "2025-09-06T12:53:20",
"upload_time_iso_8601": "2025-09-06T12:53:20.868495Z",
"url": "https://files.pythonhosted.org/packages/ba/d5/fb65d5a059da93e578dadebc2b7041f8b756ce464c056f7a5dfd3515346e/ssrjson-0.0.4-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "58e81fbcdc38cb691c41c2f9ee6f5e6ba9cfc6e6b5ec133a892d835c33a7c388",
"md5": "d1036c956d9dacf0308e56c30452fae6",
"sha256": "28f8be2494c68f54127f74f8fe75fc6ddf4e259096b09ba4f103d75ccbce6881"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d1036c956d9dacf0308e56c30452fae6",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 677921,
"upload_time": "2025-09-06T12:53:22",
"upload_time_iso_8601": "2025-09-06T12:53:22.083221Z",
"url": "https://files.pythonhosted.org/packages/58/e8/1fbcdc38cb691c41c2f9ee6f5e6ba9cfc6e6b5ec133a892d835c33a7c388/ssrjson-0.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3308005847e7a507393f902cfb7a40c2fdd50eb8b13bc9df641bfe23f698cae2",
"md5": "4dd9c2793c2ffa7708563fb7cd94cac0",
"sha256": "fcc8c428e0fc41204a427e86ccc819daa821a43fa1b27897018cbe6d6d8ac4ae"
},
"downloads": -1,
"filename": "ssrjson-0.0.4-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "4dd9c2793c2ffa7708563fb7cd94cac0",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 632910,
"upload_time": "2025-09-06T12:53:23",
"upload_time_iso_8601": "2025-09-06T12:53:23.513091Z",
"url": "https://files.pythonhosted.org/packages/33/08/005847e7a507393f902cfb7a40c2fdd50eb8b13bc9df641bfe23f698cae2/ssrjson-0.0.4-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "79ea3f49eb0407813377960be6df71ad7c37bee08d542548735fa929c8b7b347",
"md5": "07999d072e471b4dc2b4234f555fc3bf",
"sha256": "a308f5f6612c75f6ea1be3bc9047af8b3ad48d55255feaffb5182d95227642ea"
},
"downloads": -1,
"filename": "ssrjson-0.0.4.tar.gz",
"has_sig": false,
"md5_digest": "07999d072e471b4dc2b4234f555fc3bf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 363039,
"upload_time": "2025-09-06T12:53:24",
"upload_time_iso_8601": "2025-09-06T12:53:24.581425Z",
"url": "https://files.pythonhosted.org/packages/79/ea/3f49eb0407813377960be6df71ad7c37bee08d542548735fa929c8b7b347/ssrjson-0.0.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-09-06 12:53:24",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "ssrjson"
}