rjson
Fast JSON for Python, written in Rust directly against the CPython C API.
rjson is a drop-in replacement for orjson and the standard
library json: orjson's exact output, json's errors and options, and less CPU for every
request, log line and message you handle.
| vs orjson | vs json |
|
|---|---|---|
loads (parse) |
1.23× faster | 3.80× faster |
dumps (serialize) |
1.47× faster | 15.2× faster |
| NDJSON / JSON Lines | 1.4–2.6× faster (loads_ndjson) |
2.3–9.3× faster |
| compatibility | byte-identical output to orjson.dumps |
json.JSONDecodeError, every json.dumps option |
Geometric mean over the 10 cases of the reference benchmark, CPython 3.13.12, orjson 3.12.0, PGO wheels as published. NDJSON: 60–700-byte lines, CPython 3.11–3.13.
Quick start
pip install pyrjson # the PyPI name; you still `import rjson`
import rjson
from datetime import datetime
from uuid import uuid4
data = rjson.loads(b'{"name": "rjson", "tags": ["fast", "safe"]}')
payload = rjson.dumps({"at": datetime(2024, 5, 1, 9, 30), "id": uuid4(), **data}) # -> bytes
text = rjson.dumps_str(data) # -> str, without a .decode() copy
events = rjson.loads_ndjson(b'{"a": 1}\n{"a": 2}\n') # -> [{'a': 1}, {'a': 2}]
Coming from orjson or json? Most code switches with a find-and-replace:
migration guide.
Why rjson
- Faster where services spend time. Record-shaped data (API pages, DB rows, events) is
where rjson leads most:
loadsof records is 1.40× faster than orjson,dumps1.63×. Datetimes, UUIDs and Enums serialize 2.3–3.2× faster than orjson, with nodefault=. - Drop-in, verified.
dumpsoutput is byte-identical to orjson's, includingdatetime,UUID, dataclasses andEnum. Errors arejson.JSONDecodeErrorwithjson's positions. Everyjson.dumpsoption (indent,separators,sort_keys,ensure_ascii,allow_nan) has an exact equivalent, andlenient=Trueaccepts exactly whatjson.loadsaccepts. - More than a parser.
loads_ndjsonfor NDJSON and JSON Lines,dumps_strfor code that needs astr, and anrjsoncommand line that replacespython -m json.tool(same output, 2–10× faster on real files). - Hardened for untrusted input. Differential fuzzing against
json, an AddressSanitizer CI job, nesting and thread-stack limits, and every CPython internal it uses gated by version and self-tested at import. - Ready to install. PGO-optimized wheels for CPython 3.10–3.14 on Linux (glibc and musl, x86_64 and aarch64), macOS and Windows, with build provenance attestations. MIT licensed.
If rjson saves you CPU time, a ⭐ on GitHub helps other people find it.
rjson, orjson and json compared
json (stdlib) |
orjson | rjson | |
|---|---|---|---|
loads / dumps speed vs json |
1× / 1× | 3.08× / 10.4× | 3.80× / 15.2× |
dumps returns |
str |
bytes |
bytes, or str with dumps_str (no decode copy) |
datetime, UUID, dataclass, Enum |
via default= |
native | native, byte-identical to orjson |
| NDJSON / JSON Lines in one call | no | no | loads_ndjson |
indent, separators, sort_keys, ensure_ascii, allow_nan |
all | indent=2 and sort_keys only |
all, with json's output |
accepts NaN, a BOM, lone surrogates |
yes | no | with lenient=True |
non-str dict keys |
int, float, bool, None | OPT_NON_STR_KEYS |
non_str_keys=True |
| decode errors | JSONDecodeError |
JSONDecodeError (subclass) |
json.JSONDecodeError itself, json's positions |
| command-line formatter | python -m json.tool |
no | rjson: same output, 2–10× faster |
| type stubs | yes | yes | yes |
What's new in 0.4.0
- Records parse up to 40% faster. A shape cache recognizes objects that repeat the same keys in the same order and builds each dict by copying a template, instead of inserting key by key. On CPython 3.11/3.12 those dicts also use about 16% less memory.
rjson.loads_ndjsonparses newline-delimited JSON in one call, 1.4–2.6× faster than a per-line loop on orjson, withloads's exact results and errors.rjson --json-linesuses it:--validateis 26% faster.
Full list: CHANGELOG.md.
Benchmarks
rjson is faster than orjson on 19 of the 20 loads/dumps cases. The other one is at parity within this host's run-to-run noise: int array dumps (0.99×; per-run 0.99–1.02×).
All numbers, and how they were measured
Speedup = the other library's time ÷ rjson's time (higher is better). Median time per
call over 5 runs, CPython 3.13.12, orjson 3.12.0, x86_64 (Xeon, 4 cores), PGO build
(scripts/build_pgo.sh, as the published wheels are built). loads parses the documents'
UTF-8 bytes; dumps returns bytes in both rjson and orjson. Raw results, with each
case's per-run range: docs/img/benchmark-results.json.
| case | loads vs orjson | dumps vs orjson | loads vs json | dumps vs json |
|---|---|---|---|---|
| twitter.json | 1.20× | 1.58× | 3.13× | 13.4× |
| citm_catalog.json | 1.18× | 1.38× | 2.69× | 9.95× |
| canada.json | 1.09× | 1.25× | 4.77× | 19.3× |
| github.json | 1.48× | 1.86× | 3.07× | 17.5× |
| small dict | 1.56× | 1.45× | 7.47× | 18.4× |
| records | 1.40× | 1.63× | 2.61× | 13.6× |
| unicode strings | 1.29× | 1.11× | 2.24× | 49.1× |
| escaped strings | 1.10× | 2.81× | 4.85× | 5.70× |
| int array | 1.14× | 0.99× | 3.28× | 11.1× |
| float array | 1.01× | 1.30× | 7.40× | 19.1× |
| geomean | 1.23× | 1.47× | 3.80× | 15.2× |
Reproduce and redraw:
benches/fetch_corpus.sh # sha256-pinned corpora -> benches/data/
scripts/build_pgo.sh python3.13 && pip install target/wheels/*cp313*.whl # or a plain build
python benches/corpus_benchmark.py --json --repeat 11 --output-json results.json
python benches/make_charts.py results.json # -> docs/img/*.svg + this table
dumps_str(returnsstr) is faster than orjson'sdumps+.decode()on real documents (1.71–1.91× in the showcase). Against orjson'sbytesalone it trails on emoji-heavy text, because astrholding emoji stores 4 bytes per character.loadsof the same large non-ASCIIstrobject, over and over, is slower than orjson: orjson keeps a UTF-8 copy attached to that string, which rjson deliberately does not (it would double the string's memory, #10). Withbytes, or a newstrper call as a server gets, rjson is faster.- Methodology, per-version results and the roadmap: docs/PERFORMANCE_REVIEW.md.
NDJSON / JSON Lines
rjson ÷ orjson time (lower is better), each library's per-line loop vs rjson.loads_ndjson
(plain release builds, best of 15):
| NDJSON input | rjson.loads per line |
rjson.loads_ndjson |
|---|---|---|
| log lines, 200 B × 50k | 0.70–0.75 | 0.44–0.47 |
| events, 60 B × 100k | 0.72–0.76 | 0.39–0.41 |
| API records, 700 B × 8k | 0.44–0.82 | 0.41–0.70 |
| mixed shapes × 60k | 0.76–0.83 | 0.46–0.52 |
Ranges span CPython 3.11, 3.12 and 3.13. Details: PERFORMANCE_REVIEW.md, loads item 13.
On production-shaped workloads
API responses and request bodies, log records, application types and str output, each
checked for identical output before timing:
docs/SHOWCASE.md (python benches/showcase.py). The
examples below, measured end to end:
Faster JSON in Python services.
Use it in your stack
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import rjson
class RJSONResponse(JSONResponse):
def render(self, content) -> bytes:
return rjson.dumps(content)
app = FastAPI()
@app.get("/items")
def items() -> RJSONResponse:
return RJSONResponse([{"id": 1, "name": "widget"}])
Return RJSONResponse(...) directly for dicts and lists. Measured on whole requests through
the app, against stock FastAPI's own fast path (a return type, serialized by Pydantic's
dump_json): a 50-row page is 1.25–1.4× faster, 1.8–1.9× with UUID/datetime/Enum fields,
and a 1,000-row export 3.0–3.2× faster; against an endpoint without a return type, 9–74×
(numbers). Don't set it as
default_response_class: endpoints that return Pydantic models already go through
dump_json. examples/fastapi_app.py adds a fallback for
Decimal, Pydantic models and dataclasses, and rjson-parsed request bodies.
Django and Flask
# Django: a JsonResponse rendered by rjson
from django.http import HttpResponse, JsonResponse
import rjson
class RJSONResponse(JsonResponse):
def __init__(self, data, safe=True, **kwargs):
if safe and not isinstance(data, dict):
raise TypeError("set safe=False to serialize non-dict objects")
kwargs.setdefault("content_type", "application/json")
HttpResponse.__init__(self, content=rjson.dumps(data), **kwargs)
# Flask: every jsonify() / dict return goes through rjson
from flask.json.provider import JSONProvider
class RJSONProvider(JSONProvider):
def dumps(self, obj, **kwargs):
return rjson.dumps_str(obj)
def loads(self, s, **kwargs):
return rjson.loads(s)
app.json = RJSONProvider(app)
examples/django_json.py
and examples/flask_json.py
add a fallback for Decimal, sets and dataclasses, and a request-body parser that turns
invalid JSON into a 400 with the error position.
Logs, NDJSON, Redis and Kafka
records = rjson.loads_ndjson(body) # NDJSON in memory: one call
line = rjson.dumps(record) + b"\n" # one JSON object per log line
producer = KafkaProducer(value_serializer=rjson.dumps) # bytes in, bytes out
examples/json_logging.py: alogging.Formatterwriting one JSON object per line (2.2–2.5 µs per record, 2.4–2.7× faster than the same formatter onjson), plus streamed NDJSON read/write (writing 12.5× faster, reading 2.5–2.8×).examples/codec.py: a versioned bytes codec for Redis/Kafka with typed round trips, andvalue_serializer/value_deserializercallables. Round trips of JSON-native payloads are 4.1–4.6× faster than the same codec onjson, and faster thanpickle.docs/ASYNC.md: aiohttp, httpx, asyncpg,redis.asyncioand aiokafka one-liners, and how to keep large payloads from blocking the event loop.
Migrating from json or orjson
| you wrote | with rjson |
|---|---|
json.loads(s) / orjson.loads(s) |
rjson.loads(s) |
[json.loads(l) for l in data.splitlines() if l.strip()] |
rjson.loads_ndjson(data) |
orjson.dumps(obj) |
rjson.dumps(obj) (same bytes) |
json.dumps(obj, separators=(",", ":"), ensure_ascii=False) |
rjson.dumps_str(obj) |
json.dumps(obj).encode() |
rjson.dumps(obj) |
except json.JSONDecodeError / orjson.JSONDecodeError |
except rjson.JSONDecodeError |
except TypeError / orjson.JSONEncodeError around dumps |
except rjson.JSONEncodeError (TypeError keeps working) |
json.dumps(obj, default=f) / orjson.dumps(obj, default=f) |
rjson.dumps(obj, default=f) |
orjson.dumps(datetime/UUID/dataclass/Enum) |
the same bytes |
json.dumps({1: "a", None: "b"}) / orjson.dumps(obj, option=OPT_NON_STR_KEYS) |
rjson.dumps(obj, non_str_keys=True) (key text as json writes it) |
orjson.dumps(obj, option=OPT_INDENT_2 | OPT_SORT_KEYS) |
rjson.dumps(obj, indent=2, sort_keys=True) (same bytes) |
json.dumps(obj, indent=4, sort_keys=True) |
rjson.dumps_str(obj, indent=4, sort_keys=True, ensure_ascii=True) (drop ensure_ascii to keep non-ASCII) |
json.dumps(obj) (all defaults) |
rjson.dumps_str(obj, separators=(", ", ": "), ensure_ascii=True, allow_nan=True) (same text) |
json.loads(s) of input with NaN, a BOM or lone surrogates |
rjson.loads(s, lenient=True) (the same result) |
python -m json.tool |
rjson / python -m rjson (same options, same output; command line) |
orjson.dumps(obj, option=OPT_PASSTHROUGH_DATETIME) |
rjson.dumps(obj, passthrough=rjson.PASSTHROUGH_DATETIME) (also _UUID, _DATACLASS, _ENUM) |
json.dumps(obj, default=lambda o: o.isoformat()) for datetimes |
rjson.dumps(obj) (the same text, except UTC offsets with a seconds part, which are rounded to the minute) |
Two differences are by design: dumps raises on NaN/Infinity unless allow_nan=True
(then NaN, as json writes it; orjson writes null), and floats below 1e-4 are written
in shortest form (1e-7, as orjson; json writes 1e-07, the same value).
API
| name | kind | notes |
|---|---|---|
loads(data, *, lenient=False) |
function → object | data: str, bytes, bytearray or memoryview (any layout) |
loads_ndjson(data, *, lenient=False) |
function → list |
NDJSON / JSON Lines, one document per line, in one call |
dumps(obj, *, default=None, passthrough=0, non_str_keys=False, indent=None, separators=None, sort_keys=False, ensure_ascii=False, allow_nan=False) |
function → bytes |
UTF-8 JSON, like orjson.dumps |
dumps_str(...) |
function → str |
same options; like json.dumps(obj, ensure_ascii=False, separators=(",", ":")) |
dumps_bytes(...) |
function → bytes |
alias of dumps, kept for compatibility |
PASSTHROUGH_DATETIME, _UUID, _DATACLASS, _ENUM |
int flags |
for passthrough=, combine with | |
JSONDecodeError |
exception | json.JSONDecodeError itself (a ValueError) |
JSONEncodeError |
exception | subclass of both TypeError and ValueError, like orjson.JSONEncodeError |
__version__ |
str |
package version |
The wheel ships type stubs (py.typed), so mypy and pyright check calls to rjson.
Options and behavior in detail
lenient=True(loads,loads_ndjson): accepts everythingjson.loadsaccepts, with the same result:NaN/Infinity/-Infinity, a UTF-8 BOM on bytes and numbers overflowing toinfare parsed natively (no speed cost); lone surrogates ("\ud83d", sent by JavaScript clients that cut an emoji in half), UTF-16/UTF-32 bytes and nesting deeper than 1024 go throughjson.loads. The default stays strict, like orjson.loads_ndjson:[rjson.loads(line) for line in data.split(b"\n") if line.strip()]in one call: each line gives whatloads(line)gives (the same errors too), blank lines are skipped,\r\nworks, and an error'slineno/colnoare those of the whole input. For a very large input, call it on chunks of about 16 KiB cut after a newline, so each chunk's documents are used while they are still in the CPU cache.- Types:
dict(str keys),list,tuple,str,int(any size),float,bool,None, and their subclasses (IntEnum,strenums,OrderedDict,namedtuple, …). - Native types, byte-identical to orjson:
datetime(RFC 3339:2024-05-01T09:30:00,.ffffffonly when non-zero,+HH:MMwhen aware),date,time,uuid.UUID(lowercase, hyphenated), dataclasses (as objects;_-prefixed names skipped, as in orjson) andEnummembers (their value). Subclasses ofdatetime/date/time/UUIDgo todefault=. Three orjson bugs are not copied: atzinfowhoseutcoffset()raises, or a deleted__slots__field, raise the Python error (orjson crashes);utcoffset()returningNonegives no offset, as inisoformat()(orjson writes+00:00); an offset whose seconds round up to a whole hour carries into the hour (orjson writes+00:60). passthrough=:rjson.PASSTHROUGH_*flags send those kinds todefault=(or make them raise) instead, e.g. to tag them for an exact round trip (examples/codec.py), like orjson'sOPT_PASSTHROUGH_*.non_str_keys=True: dict keys may beint(any size),float,bool,None(written exactly asjson.dumpswrites them:"1","1e-07","NaN","true","null"),Enummembers (their value), anddatetime/date/time/UUID(their native text, like orjson'sOPT_NON_STR_KEYS). Other key types raise;default=is not called for keys. Likejsonand orjson, a coerced key can duplicate a str key ({1: …, "1": …}writes"1"twice). Off by default: a non-str key raises.indent=/sort_keys=:indent=2andsort_keys=Truegive exactly the bytes of orjson'sOPT_INDENT_2andOPT_SORT_KEYS(keys sorted by code point; dataclass fields keep their order); other widths (indent=4,indent=0) lay out likejson.dumps(indent=n). Compact calls pay nothing for them; the options themselves are not yet as fast as orjson's (twitter.json:sort_keys0.78×,indent=20.48×).json.dumpsoptions:indentalso takes a str (indent="\t"), andseparators=,ensure_ascii=True(non-ASCII and DEL as\uXXXX, surrogate pairs above U+FFFF) andallow_nan=True(NaN/Infinity/-Infinity) behave as injson.dumps, so anyjson.dumpscall has an exact equivalent (numbers aside, see floats below 1e-4). Only the defaults differ: compact, non-ASCII kept, NaN raises. Withensure_ascii=True,dumpsalso writes lone surrogates (as\udXXX, likejson).default=: called with each value rjson cannot serialize; its return value is serialized in its place (and passed todefaultagain if still unsupported), as injson.dumpsand orjson. Exceptions it raises propagate unchanged. It is not called for NaN/Infinity or dict keys (seenon_str_keys=), which still raise. Supported values never reach it, so native data runs at full speed.- Errors:
loadsraisesJSONDecodeErrorwithpos/lineno/colnomatchingjson.dumps/dumps_strraiseJSONEncodeErrorfor unsupported types, non-str keys (unlessnon_str_keys=True), NaN/Infinity, and nesting deeper than 254 (which also catches circular references), so bothexcept TypeErrorandexcept ValueErrorcatch it. A lone surrogate raisesUnicodeEncodeErrorindumps;dumps_strpasses it through. - Precision: floats round-trip exactly (shortest representation, e.g.
1e+16), and integers of any size are exact in both directions.loadsaccepts nesting up to 1024.
Command line: JSON beautifier
pip install pyrjson also installs rjson, a faster drop-in for python -m json.tool: the
same options and byte-for-byte the same output (checked against json.tool on the whole
benchmark corpus), plus a formatter mode for files and CI.
$ curl -s https://api.github.com/repos/TinDang97/rjson | rjson --sort-keys --no-ensure-ascii
$ rjson data.json pretty.json # beautify (indent 4, like json.tool)
$ rjson --compact data.json min.json # minify (also --minify)
$ rjson --tab / --indent 2 / --no-indent # other layouts
$ rjson --json-lines --compact < events.jsonl # JSON Lines / NDJSON, streamed
$ rjson -i --indent 2 config/*.json # reformat files in place (only changed ones)
$ rjson --check --indent 2 config/*.json # CI: exit 1 if a file is invalid or not formatted
$ rjson --validate *.json # exit 1 if a file is not valid JSON
End to end, process start included (CPython 3.13.12, median of 5;
benches/cli_benchmark.py,
results):
| input | python -m json.tool |
rjson |
speedup |
|---|---|---|---|
| twitter.json (0.6 MB) | 81 ms | 38 ms | 2.1× |
| citm_catalog.json (1.7 MB) | 138 ms | 43 ms | 3.2× |
| canada.json (2.2 MB, floats) | 360 ms | 66 ms | 5.5× |
| github.json (55 KB) | 34 ms | 33 ms | 1.0× (process start dominates) |
| 60 MB file, pretty-print | 4.61 s | 841 ms | 5.5× |
60 MB file, --sort-keys |
4.24 s | 680 ms | 6.2× |
60 MB file, --compact |
3.90 s | 497 ms | 7.8× |
200k JSON Lines, --compact |
4.27 s | 430 ms | 9.9× |
Syntax colors on a terminal (--color auto|always|never; honors NO_COLOR,
FORCE_COLOR, PYTHON_COLORS), NaN/Infinity accepted like json.tool (--strict
rejects them), errors as json.tool prints them (JSON Lines errors name the input line),
atomic in-place writes that keep file permissions. Also python -m rjson,
python -m rjson.tool, and rjson.tool.beautify(text, indent=4, ...) from Python. The
only output difference from json.tool: floats below 1e-4 are written in shortest form
(1e-7; json writes 1e-07, the same value). json.tool --json-lines FILE fails on
CPython 3.13+ ("I/O operation on closed file"); rjson --json-lines FILE works.
Why it is faster than orjson
Both are Rust on the CPython C API with raw METH_FASTCALL entry points, a dict-key
cache and zmij float formatting, so none of that explains the gap. These design choices do.
Each row isolates one of them, is measured head to head with identical output
(benches/why_faster.py,
results;
CPython 3.13, orjson 3.12.0, x86_64 with AVX-512, PGO wheel), and cites the orjson 3.12.0
source it describes.
| orjson 3.12.0 | rjson | measured (rjson vs orjson) | |
|---|---|---|---|
loads |
parses into a yyjson document tree, then walks the tree to create Python objects (src/deserialize/backend/yyjson.rs) |
creates each Python object as it parses: one pass, no tree | 60 MB file: 85 MB vs 183 MB peak memory above the input (both build the same result, so the ~99 MB difference is what orjson holds while parsing: the tree), 0.19 s vs 0.29 s |
| string escaping | 32-byte AVX-512 blocks, but each escape restarts the block: one load, compare and store per escape (src/serialize/writer/str/avx512.rs) |
every escape in a block handled from one compare mask; AVX-512, AVX2 or SSE2 chosen at run time | 1 MB of text with an escape every 12 characters: 3.39 vs 0.96 GB/s, same CPU, both on AVX-512 |
| aware datetimes | for datetime.timezone.utc, per value: up to three hasattr probes, then a utcoffset() call that allocates a timedelta (src/ffi/pydatetimeref.rs, slow_offset) |
reads a timezone's offset once and reuses it; date fields read from the C struct |
10,000 UTC datetimes: 28 vs 94 ns per datetime |
output to str |
returns bytes; getting a str means .decode(), a second allocation, copy and UTF-8 validation |
writes the str's own storage directly (dumps_str) |
twitter.json: 1.9 MB vs 3.2 MB allocated per call, 277 vs 474 µs |
| records (0.4.0) | creates each dict and inserts its keys one by one (src/deserialize/backend/yyjson.rs) |
recognizes objects that repeat a key set and copies a template dict (CPython 3.11–3.13) | records loads: 0.90 → 0.71 of orjson's time with the shape cache (0.3.0 → 0.4.0) |
The remaining difference is per-value work. rjson dispatches on exact type pointers, keeps
the output cursor in a register, and sizes the output buffer from recent calls (orjson
starts at 4 KiB and doubles, src/serialize/writer/byteswriter.rs). Instruction counts
are deterministic, so host noise can't move them:
| instructions per call (valgrind) | rjson | orjson | orjson ÷ rjson |
|---|---|---|---|
dumps small dict |
2,182 | 2,606 | 1.19 |
loads small dict |
3,994 | 4,967 | 1.24 |
dumps twitter.json |
2.01 M | 3.15 M | 1.56 |
loads twitter.json |
10.19 M | 13.19 M | 1.29 |
Where it is not different: page faults for large results are the same (the output has
to be written either way), and indent=/sort_keys= are still slower than orjson's (a
second pass over the compact output). Reproduce with python benches/why_faster.py
(valgrind for the instruction counts). The full design, stage by stage:
docs/ARCHITECTURE.md walks both pipelines function by function
(input handling, the key and shape caches, number parsing, string decoding, the
output-buffer policy, escaping kernels, the dict walk, native types, guarded mode and the
safety checks), with the reason and the measured effect of each choice.
Production use
The full report, with every number and how it was measured: docs/PRODUCTION_READINESS.md. In short, rjson is ready for services whose payloads are JSON-native (dicts, lists, strings, numbers, datetimes, UUIDs), and not yet a drop-in for code that relies on orjson-only options.
FAQ
Is it faster than orjson in real services, not just benchmarks?
On our production-shaped suite (benches/production_benchmark.py: REST pages, request
bodies, NDJSON logs, 100 MB files, cache blobs) rjson is faster on most shapes (geomean
dumps 0.67×, loads 0.83× of orjson's time, PGO wheels) and uses 30–37% less peak
memory on large loads. The report lists the few shapes where it is not.
Is it safe?
It checks the exact type of every value, reserves the worst-case output size before
writing, and version-gates every CPython internal it uses, with self-tests at import.
Untrusted input is bounded: nesting limits plus a thread-stack check (deep documents raise
RecursionError instead of overflowing a small thread stack), and CPython's integer digit
limit. CI runs the tests, differential fuzzing against json and thread/re-entrancy
stress tests, also on an AddressSanitizer build. It is still 0.x: pin the version.
Report vulnerabilities privately: SECURITY.md.
Does it work with asyncio / uvloop?
Yes. Calls are synchronous and hold the GIL, so a large payload blocks the event loop, and
asyncio.to_thread does not help. docs/ASYNC.md shows what to do instead.
Is it thread-safe?
Yes, on regular (GIL) CPython builds, including calls re-entered from default= and
threads switching mid-call (stress-tested). Threads do not parallelize JSON work.
Free-threaded builds (3.13t/3.14t) and subinterpreters are not supported yet. In threads
with small stacks (musl/Alpine's 128 KiB default, threading.stack_size), very deep
documents raise RecursionError: about 975 nested arrays or 620 nested objects fit in
128 KiB, the full 1024 levels in 256 KiB.
Why does dumps return bytes?
It is what you send over the network or write to a file, and it avoids a copy. Use
dumps_str when you need a str.
Should I compress, or switch to msgpack / Arrow to go faster?
Compress in the transport (HTTP middleware, Kafka compression.type), and only payloads
of a few KB and up: compression costs as much CPU as serialization. Binary formats aren't
faster when the result is Python dicts, because creating objects dominates. Arrow and
Polars win when data stays columnar. Numbers:
Transfer size.
Why is dumps_str sometimes slower than dumps?
A str containing emoji must store every character in 4 bytes, and CJK text in 2, while
UTF-8 bytes stay compact.
Why does my previously accepted request now fail with a 422?
By default loads rejects a UTF-8 BOM, NaN/Infinity literals and escaped lone
surrogates, like orjson does (the stdlib accepts them). Pass lenient=True to accept
exactly what json.loads accepts.
Installation
The PyPI distribution is pyrjson (the name rjson on PyPI belongs to an unrelated
project). You still import rjson.
pip install pyrjson # or: uv add pyrjson
Wheels are PGO-optimized builds for CPython 3.10–3.14 on Linux (manylinux and musllinux,
x86_64 and aarch64), macOS (arm64 and x86_64) and Windows (x86_64), with build provenance
attestations (gh attestation verify <wheel> --repo TinDang97/rjson). Elsewhere pip builds
from the sdist, which needs a Rust toolchain. The development version:
pip install "git+https://github.com/TinDang97/rjson"
# or, from a checkout:
pip install maturin && maturin develop --release
Compatibility
- CPython 3.10–3.14 on Linux x86_64/aarch64 (glibc and musl), macOS arm64 and Windows (CI). x86_64 builds target x86-64-v2 and select AVX2/AVX-512 kernels at runtime.
- Not supported: PyPy, GraalPy, free-threaded (no-GIL) builds, subinterpreters.
Status
Experimental. The API may change before 1.0; pin the version you test against.
Contributing
Bug reports and pull requests are welcome. CONTRIBUTING.md covers the development setup, the hard rules for code that touches the C API, and how to benchmark. Security issues: SECURITY.md. Changes: CHANGELOG.md.
uv venv .venv -p 3.13 && . .venv/bin/activate
uv pip install maturin orjson pytest
maturin develop --release && python -m pytest tests -q
| path | contents |
|---|---|
src/parser.rs, src/lemire.rs |
loads, loads_ndjson |
src/ser.rs, src/native.rs |
dumps / dumps_str, native types |
src/entry.rs, src/compat.rs |
C-API entry points, version-portable helpers |
tests/ |
pytest suites |
python/rjson/ |
package: __init__.py, the command line (tool.py, __main__.py), type stubs (__init__.pyi) |
examples/ |
FastAPI, Django, Flask, logging/NDJSON and Redis/Kafka integrations (tested) |
benches/ |
corpus_benchmark.py (reference), showcase.py (vs orjson on production shapes), production_benchmark.py (production workloads), examples_benchmark.py (the examples on rjson vs json vs orjson), cli_benchmark.py (the command line vs json.tool), why_faster.py (each design difference, measured), perf_gate.py, make_charts.py / make_showcase_charts.py / make_demo_svg.py (README charts, demo), demo.py |
docs/ |
architecture, showcase, performance review, production readiness report, async guide |
Troubleshooting source builds
- Linker errors (
symbol(s) not found for architecture arm64): Python and Rust must target the same architecture. Check withpython3 -c "import platform; print(platform.machine())"; on Apple Silicon use an arm64 Python such as/opt/homebrew/bin/python3, thencargo cleanand rebuild. - Missing Python headers: install your Python's development package (e.g.
python3-dev).
Roadmap
- An incremental NDJSON decoder for sockets and a streaming encoder for async I/O; free-threading and subinterpreter support (docs/ASYNC.md)
- Performance: NEON kernels for aarch64;
indent=/sort_keys=written by the serializer itself; deterministic PGO training (fixed iteration counts)
License
MIT © 2025 Tin Dang. src/lemire.rs is adapted from
fast-float (MIT OR Apache-2.0).
Metadata
Release files for pyrjson 0.4.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| pyrjson-0.4.0.tar.gz | 436.0 kB | With provenance | Details for pyrjson-0.4.0.tar.gz |
Built distributions (wheels)
Total release size: 13.4 MB
Release files / pyrjson-0.4.0.tar.gz
| Download URL | pyrjson-0.4.0.tar.gz |
|---|---|
| Size | 436.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
0183bb70ab3af73239501c94ee8a7cd1a8af121706591b877c7d87f4a98bebcf
|
|
BLAKE2b-256 checksum How to use checksums |
8f45c00315b83f212575749eebe9f6b2420c40804f3e63304c51337695d93152
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp314-cp314-win_amd64.whl
| Download URL | pyrjson-0.4.0-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 307.0 kB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
434a477a394c639f81d2d80c1ac1f7417f6df3ae8df0576673b7f15fa074f9e6
|
|
BLAKE2b-256 checksum How to use checksums |
236d02b086cd50a2c00d351504297b1433104155b052c0365de95942028863ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl
| Download URL | pyrjson-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 463.7 kB |
| Tags | CPython 3.14 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
d30c0a5797c49184bf59631b09071191d90ab84edf468a80cd4049f97cbcdaaa
|
|
BLAKE2b-256 checksum How to use checksums |
a45104f0c0e29dc6d8eba158167c6cc97cb872c16774c65ad9f0a1a2c8b96262
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp314-cp314-musllinux_1_2_aarch64.whl
| Download URL | pyrjson-0.4.0-cp314-cp314-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 408.4 kB |
| Tags | CPython 3.14 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
7ecf17bbde49b5e64d00340e8c2828394d193804634a56d256a217a7d34dcf83
|
|
BLAKE2b-256 checksum How to use checksums |
52ecd1bd8dc0ac8391bb544096f6e55891317125ef07d703abb2c3057ca38a71
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrjson-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 371.0 kB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
94bd45d0a96e3168b2cda6f564f4a2a908fb77878e1bf11da61d18881a3e3983
|
|
BLAKE2b-256 checksum How to use checksums |
9810d1d1a864d7831383a2004f6bd58be4210f0ccceee8e0021b6db952b27fc1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrjson-0.4.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 330.2 kB |
| Tags | CPython 3.14 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
7f552c3135f1f2f659df9b040cdf69975e539b04bf5775bd4a4bc5e043aa54ee
|
|
BLAKE2b-256 checksum How to use checksums |
7729fd2b9cdb6d2cc7e631a99a169b8ebd8c623a90737310e4fe1a982c3faa2a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | pyrjson-0.4.0-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 325.6 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7ef607cd7dd6ad6023a918d04bf7d70a1a0a6ab008d232657acea81d959f48c8
|
|
BLAKE2b-256 checksum How to use checksums |
84676fff0cce211dafcf8ef8f0cca7766fc81087cbb797ccf4563d515c6da46d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl
| Download URL | pyrjson-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl |
|---|---|
| Size | 377.3 kB |
| Tags | CPython 3.14 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ee592498ab78d3827dab4b897d677f5e06faf5646c93cdc5f96e670e64afcfe5
|
|
BLAKE2b-256 checksum How to use checksums |
93fef9912108521d162fb9c3d8699c751fc477bb3df7806514863353b29f90c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp313-cp313-win_amd64.whl
| Download URL | pyrjson-0.4.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 299.5 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
e2cc979b67c38e132d207d995bc28a343ee93cbca0023788c9f24ebda9528c5a
|
|
BLAKE2b-256 checksum How to use checksums |
ba53be658da52c8abedb918d51235c1c55a98f0ee1956d3b4cf4322d45529ddb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl
| Download URL | pyrjson-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 468.3 kB |
| Tags | CPython 3.13 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
ddf987c49018b24a173e6e258fded75bf739db28903412bfcb10a67c397392d1
|
|
BLAKE2b-256 checksum How to use checksums |
573a93380f57281c30a7d21b61902ad569be8815062eb5036dc92fc128605b90
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl
| Download URL | pyrjson-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 410.8 kB |
| Tags | CPython 3.13 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
eab77590422257415cbeb7cab161bca13b6e607918f43adecce51aa343446ca0
|
|
BLAKE2b-256 checksum How to use checksums |
bacb1a5c8b71509a691a184fa67316ec63edf44f16827223a056138b8489b497
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrjson-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 376.7 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
07bdecc8293c350d8fc4422b868498318ba83a829f7c5fc63b74e42fe2106155
|
|
BLAKE2b-256 checksum How to use checksums |
dbafca7b2cbea04139575ac4eaeb7e8017d083785f52adb25b83faec56e0868b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrjson-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 334.8 kB |
| Tags | CPython 3.13 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
7cf91639352043384b065eb5c29ad0501a8bbe48e5b458e6132d51ce038b6fd0
|
|
BLAKE2b-256 checksum How to use checksums |
3b05d46c140cd8a7974028a2c20aaf5b0732f069586b3fd63815b24d70a28be9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | pyrjson-0.4.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 327.1 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
359fdb79dc83ee5b1a002b90e09fd39aabf983baedd1fd796db52209b3632cee
|
|
BLAKE2b-256 checksum How to use checksums |
d2b0c5b2b6a14eee3b7ca49a5a5d483b69fc27fe72f2fcb82898793ae695590a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | pyrjson-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 384.1 kB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
33ccfdfe14bda4b25e77900b663c703225fa1d2313160844fe0ca02b4079183a
|
|
BLAKE2b-256 checksum How to use checksums |
1113bb13076bda702bceef58cb5c95ac2e8020667f0fc8f814c90077af91164d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp312-cp312-win_amd64.whl
| Download URL | pyrjson-0.4.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 304.5 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
49e8ab5e4869851108de5fa10a4481fdb518fcf6c78406adc1cec2a92694ec06
|
|
BLAKE2b-256 checksum How to use checksums |
896ccc9df368903336fcc2075cb30b8a7481440907689c91e0b4522879dd1147
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl
| Download URL | pyrjson-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 468.7 kB |
| Tags | CPython 3.12 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
5287058a077e37daf733cbc59cde807d4dd85b6af29dc5c74e24a17abbaac96a
|
|
BLAKE2b-256 checksum How to use checksums |
cfc3e33f57b88a83b7a814f4d54360f0c96c0ba5a37ab4e99f80a3aff5f8bc4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl
| Download URL | pyrjson-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 410.8 kB |
| Tags | CPython 3.12 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
8dd85d9b3d353aa6e8c76dc9e1ecc3e5b0a4d7f4e1176ea40ec1cac0e1672846
|
|
BLAKE2b-256 checksum How to use checksums |
3a83b772f5b5fe62f77da321d1a74ec28827f400ab5de15fa16b3392ac34f437
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrjson-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 377.4 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
d5d1d3fc9df3fbb657d1a403da6c99d1f1435c0d2250570f8c31ad328671b44f
|
|
BLAKE2b-256 checksum How to use checksums |
092c02836ae3c65ee9291591ec8626acf7578f2144ba40a45362ec6372923715
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrjson-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 335.3 kB |
| Tags | CPython 3.12 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
9629c5619f5df9bda0bc83f288ec1c22a13f46a60a4c2a989770a2738b296dcf
|
|
BLAKE2b-256 checksum How to use checksums |
5485c1ab1d86e532a8d123ce180e92cbcfc56e2ba81031ded5917c32d373d965
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | pyrjson-0.4.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 328.0 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
812e5bfebcf19e21673714825b82be450caae1a23b18db41c342153e5cbeef7f
|
|
BLAKE2b-256 checksum How to use checksums |
b47deb6576c5f58d8043136e9168dfcc2dc6bf8776b4d0b144f3232fbcdb3c7f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | pyrjson-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 379.8 kB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
e42d8a898c8be467fb760796e439e88a3bc7392c90cfc61223f6eb80bfb13e38
|
|
BLAKE2b-256 checksum How to use checksums |
7c91be2a8d9247231e98cc78281e7185452ba068af1fb5cae9f60da619dcd9e2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp311-cp311-win_amd64.whl
| Download URL | pyrjson-0.4.0-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 305.0 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d699a512fdca92e9bb5c55e8810117302fcab47d7777782ddbd3094cd40d47ef
|
|
BLAKE2b-256 checksum How to use checksums |
104831373680d6cccbe7f9dbaaf788600697624ef0801e9d8f653243b7cab6c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl
| Download URL | pyrjson-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 469.9 kB |
| Tags | CPython 3.11 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
19c0f312c0f51b6e95eb9c58b115c785ca60826741af98851c80c4d2f4f2b290
|
|
BLAKE2b-256 checksum How to use checksums |
04c112ad18056a5c7e68935c2eeeae7823b3eba8d56c595572cd47342a65efc3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl
| Download URL | pyrjson-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 410.8 kB |
| Tags | CPython 3.11 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
7cd723e6710667cbeac8c6accc3376e673161e655e60041ea1a7fd5f15e4fb51
|
|
BLAKE2b-256 checksum How to use checksums |
528112c346934957de35dad62486f1ce4ee18a6993577a07298e235aa404cb55
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrjson-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 373.5 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
631a64a079ac466ace83722ad8125f8385eceea405d1336b062acecb2f2f9f52
|
|
BLAKE2b-256 checksum How to use checksums |
57c492c6250f27ce8139c6ea69d34e132924e7319b46f8ca165d6209412aad99
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrjson-0.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 334.2 kB |
| Tags | CPython 3.11 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
7dcf0412e2a850969e6fe806e9c1feffbd075b8cc89d6cef391871664d600379
|
|
BLAKE2b-256 checksum How to use checksums |
d178286f6554166513b13bec8c91bd13fb1f06b30c3683f9b6afedf33c5730b0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | pyrjson-0.4.0-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 329.0 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
1cc9fca34fedd27165997d3785de5e61ad5dc111c734da5a4df713573d553f6e
|
|
BLAKE2b-256 checksum How to use checksums |
e5cdd2757961bd899a58e22ef55943b477f6e4e74987f1dfc0b5c68983baae90
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl
| Download URL | pyrjson-0.4.0-cp311-cp311-macosx_10_12_x86_64.whl |
|---|---|
| Size | 381.4 kB |
| Tags | CPython 3.11 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
734882e7f307737990d804f1207aee3f83bd5ea00c82a852bef0395851237f1f
|
|
BLAKE2b-256 checksum How to use checksums |
85937884d72bfa0a6fe592de4b2e4d73ed2cf7933ec158b19eb9d86877caa232
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp310-cp310-win_amd64.whl
| Download URL | pyrjson-0.4.0-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 297.5 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
7233030ce14c6376b3af4a7b36e7bc77a451895bb851690a8d56b7509880386e
|
|
BLAKE2b-256 checksum How to use checksums |
0acecdd8407075cf98bc2b075f38c276fbf5214b382e8bfc8206a64666c5f63a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl
| Download URL | pyrjson-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 461.4 kB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 |
|
SHA-256 checksum How to use checksums |
0e551efeed21298043f37e05aea57ef58e8057e91f61103fbc1ea640c063e92f
|
|
BLAKE2b-256 checksum How to use checksums |
00ea5c8fd035d3dcaeabd397b887da0841c0b15e9a28c749257f3e284584630c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl
| Download URL | pyrjson-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 397.2 kB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 |
|
SHA-256 checksum How to use checksums |
df4d6c3c643e5a38281f22811da1fee4e71b06166aedadee307c7d2fbff7a59d
|
|
BLAKE2b-256 checksum How to use checksums |
0fa015c1b37ad43e80ea19a8dba3567a4e7e22d8dbf353f373b823784499f5ad
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | pyrjson-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 365.7 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
1a19fc9f163dfb3952b0811f7b4b05fc9c9a9d013580c2975e76fd9a1e5da65b
|
|
BLAKE2b-256 checksum How to use checksums |
a8e65a362144b77eb436ef372dcc849cfc1807a479be4dc2f389e415116438f9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | pyrjson-0.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 328.4 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 |
|
SHA-256 checksum How to use checksums |
62bc5f310bfb507e580ca014cf250cc29cb7d3d95fc7892e22dd21d08208d0de
|
|
BLAKE2b-256 checksum How to use checksums |
7c61d61c634ebea938c4608d33c6c2eea07ffb96009e00b8b5421a00f221100a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | pyrjson-0.4.0-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 322.6 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
9228c46fff747bd2ae6657096437d3af33d1706bf2ab004048c13230aca67117
|
|
BLAKE2b-256 checksum How to use checksums |
f05dcc8e8408a8d17cd5cfc72aeb1d4e56a63e917dc6237265edd465fff4002e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logRelease files / pyrjson-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl
| Download URL | pyrjson-0.4.0-cp310-cp310-macosx_10_12_x86_64.whl |
|---|---|
| Size | 372.3 kB |
| Tags | CPython 3.10 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
fec33e07f459a53032464ae9dc98963095c055513d475360ef4762872f74967e
|
|
BLAKE2b-256 checksum How to use checksums |
56fe39154aff117697b8c8f17f97245192799ad16239a992057630d77d6f6643
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logSecurity for pyrjson 0.4.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 36 files in this release have been uploaded with provenance metadata.
Attestation for pyrjson-0.4.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 30, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.