# Changelog ## 3.10.11 ### Changed - Improve performance of UUIDs. - Publish PyPI wheels with trusted publishing and PEP 740 attestations. - Include text of licenses for vendored dependencies. ## 3.10.10 ### Fixed - Fix `int` serialization on `s390x`. This was introduced in 3.10.8. ### Changed - Publish aarch64 manylinux_2_17 wheel for 3.13 to PyPI. ## 3.10.9 ### Fixed - Fix `int` serialization on 32-bit Python 3.8, 3.9, 3.10. This was introduced in 3.10.8. ## 3.10.8 ### Changed - `int` serialization no longer chains `OverflowError` to the the `__cause__` attribute of `orjson.JSONEncodeError` when range exceeded. - Compatibility with CPython 3.14 alpha 1. - Improve performance. ## 3.10.7 - 2024-08-08 ### Changed - Improve performance of stable Rust amd64 builds. ## 3.10.6 - 2024-07-02 ### Changed - Improve performance. ## 3.10.5 - 2024-06-13 ### Changed - Improve performance. ## 3.10.4 - 2024-06-10 ### Changed - Improve performance. ## 3.10.3 - 2024-05-03 ### Changed - `manylinux` amd64 builds include runtime-detected AVX-512 `str` implementation. - Tests now compatible with numpy v2. ## 3.10.2 - 2024-05-01 ### Fixed - Fix crash serializing `str` introduced in 3.10.1. ### Changed - Improve performance. - Drop support for arm7. ## 3.10.1 - 2024-04-15 ### Fixed - Serializing `numpy.ndarray` with non-native endianness raises `orjson.JSONEncodeError`. ### Changed - Improve performance of serializing. ## 3.10.0 - 2024-03-27 ### Changed - Support serializing `numpy.float16` (`numpy.half`). - sdist uses metadata 2.3 instead of 2.1. - Improve Windows PyPI builds. ## 3.9.15 - 2024-02-23 ### Fixed - Implement recursion limit of 1024 on `orjson.loads()`. - Use byte-exact read on `str` formatting SIMD path to avoid crash. ## 3.9.14 - 2024-02-14 ### Fixed - Fix crash serializing `str` introduced in 3.9.11. ### Changed - Build now depends on Rust 1.72 or later. ## 3.9.13 - 2024-02-03 ### Fixed - Serialization `str` escape uses only 128-bit SIMD. - Fix compatibility with CPython 3.13 alpha 3. ### Changed - Publish `musllinux_1_2` instead of `musllinux_1_1` wheels. - Serialization uses small integer optimization in CPython 3.12 or later. ## 3.9.12 - 2024-01-18 ### Changed - Update benchmarks in README. ### Fixed - Minimal `musllinux_1_1` build due to sporadic CI failure. ## 3.9.11 - 2024-01-18 ### Changed - Improve performance of serializing. `str` is significantly faster. Documents using `dict`, `list`, and `tuple` are somewhat faster. ## 3.9.10 - 2023-10-26 ### Fixed - Fix debug assert failure on 3.12 `--profile=dev` build. ## 3.9.9 - 2023-10-12 ### Changed - `orjson` module metadata explicitly marks subinterpreters as not supported. ## 3.9.8 - 2023-10-10 ### Changed - Improve performance. - Drop support for Python 3.7. ## 3.9.7 - 2023-09-08 ### Fixed - Fix crash in `orjson.loads()` due to non-reentrant handling of persistent buffer. This was introduced in 3.9.3. - Handle some FFI removals in CPython 3.13. ## 3.9.6 - 2023-09-07 ### Fixed - Fix numpy reference leak on unsupported array dtype. - Fix numpy.datetime64 reference handling. ### Changed - Minor performance improvements. ## 3.9.5 - 2023-08-16 ### Fixed - Remove futex from module import and initialization path. ## 3.9.4 - 2023-08-07 ### Fixed - Fix hash builder using default values. - Fix non-release builds of orjson copying large deserialization buffer from stack to heap. This was introduced in 3.9.3. ## 3.9.3 - 2023-08-06 ### Fixed - Fix compatibility with CPython 3.12. ### Changed - Support i686/x86 32-bit Python installs on Windows. ## 3.9.2 - 2023-07-07 ### Fixed - Fix the `__cause__` exception on `orjson.JSONEncodeError` possibly being denormalized, i.e., of type `str` instead of `Exception`. ## 3.9.1 - 2023-06-09 ### Fixed - Fix memory leak on chained tracebacks of exceptions raised in `default`. This was introduced in 3.8.12. ## 3.9.0 - 2023-06-01 ### Added - `orjson.Fragment` includes already-serialized JSON in a document. ## 3.8.14 - 2023-05-25 ### Changed - PyPI `manylinux` wheels are compiled for `x86-64` instead of `x86-64-v2`. ## 3.8.13 - 2023-05-23 ### Changed - Source distribution contains all source code required for an offline build. - PyPI macOS wheels use a `MACOSX_DEPLOYMENT_TARGET` of 10.15 instead of 11. - Build uses maturin v1. ## 3.8.12 - 2023-05-07 ### Changed - Exceptions raised in `default` are now chained as the `__cause__` attribute on `orjson.JSONEncodeError`. ## 3.8.11 - 2023-04-27 ### Changed - `orjson.loads()` on an empty document has a specific error message. - PyPI `manylinux_2_28_x86_64` wheels are compiled for `x86-64-v2`. - PyPI macOS wheels are only `universal2` and compiled for `x86-64-v2` and `apple-m1`. ## 3.8.10 - 2023-04-09 ### Fixed - Fix compatibility with CPython 3.12.0a7. - Fix compatibility with big-endian architectures. - Fix crash in serialization. ### Changed - Publish musllinux 3.11 wheels. - Publish s390x wheels. ## 3.8.9 - 2023-03-28 ### Fixed - Fix parallel initialization of orjson. ## 3.8.8 - 2023-03-20 ### Changed - Publish ppc64le wheels. ## 3.8.7 - 2023-02-28 ### Fixed - Use serialization backend introduced in 3.8.4 only on well-tested platforms such as glibc, macOS by default. ## 3.8.6 - 2023-02-09 ### Fixed - Fix crash serializing when using musl libc. ### Changed - Make `python-dateutil` optional in tests. - Handle failure to load system timezones in tests. ## 3.8.5 - 2023-01-10 ### Fixed - Fix `orjson.dumps()` invalid output on Windows. ## 3.8.4 - 2023-01-04 ### Changed - Improve performance. ## 3.8.3 - 2022-12-02 ### Fixed - `orjson.dumps()` accepts `option=None` per `Optional[int]` type. ## 3.8.2 - 2022-11-20 ### Fixed - Fix tests on 32-bit for `numpy.intp` and `numpy.uintp`. ### Changed - Build now depends on rustc 1.60 or later. - Support building with maturin 0.13 or 0.14. ## 3.8.1 - 2022-10-25 ### Changed - Build maintenance for Python 3.11. ## 3.8.0 - 2022-08-27 ### Changed - Support serializing `numpy.int16` and `numpy.uint16`. ## 3.7.12 - 2022-08-14 ### Fixed - Fix datetime regression tests for tzinfo 2022b. ### Changed - Improve performance. ## 3.7.11 - 2022-07-31 ### Fixed - Revert `dict` iterator implementation introduced in 3.7.9. ## 3.7.10 - 2022-07-30 ### Fixed - Fix serializing `dict` with deleted final item. This was introduced in 3.7.9. ## 3.7.9 - 2022-07-29 ### Changed - Improve performance of serializing. - Improve performance of serializing pretty-printed (`orjson.OPT_INDENT_2`) to be much nearer to compact. - Improve performance of deserializing `str` input. - orjson now requires Rust 1.57 instead of 1.54 to build. ## 3.7.8 - 2022-07-19 ### Changed - Build makes best effort instead of requiring "--features". - Build using maturin 0.13. ## 3.7.7 - 2022-07-06 ### Changed - Support Python 3.11. ## 3.7.6 - 2022-07-03 ### Changed - Handle unicode changes in CPython 3.12. - Build PyPI macOS wheels on 10.15 instead of 12 for compatibility. ## 3.7.5 - 2022-06-28 ### Fixed - Fix issue serializing dicts that had keys popped and replaced. This was introduced in 3.7.4. ## 3.7.4 - 2022-06-28 ### Changed - Improve performance. ### Fixed - Fix deallocation of `orjson.JSONDecodeError`. ## 3.7.3 - 2022-06-23 ## Changed - Improve build. - Publish aarch64 musllinux wheels. ## 3.7.2 - 2022-06-07 ## Changed - Improve deserialization performance. ## 3.7.1 - 2022-06-03 ### Fixed - Type stubs for `orjson.JSONDecodeError` now inherit from `json.JSONDecodeError` instead of `ValueError` - Null-terminate the internal buffer of `orjson.dumps()` output. ## 3.7.0 - 2022-06-03 ### Changed - Improve deserialization performance significantly through the use of a new backend. PyPI wheels for manylinux_2_28 and macOS have it enabled. Packagers are advised to see the README. ## 3.6.9 - 2022-06-01 ### Changed - Improve serialization and deserialization performance. ## 3.6.8 - 2022-04-15 ### Fixed - Fix serialization of `numpy.datetime64("NaT")` to raise on an unsupported type. ## 3.6.7 - 2022-02-14 ### Changed - Improve performance of deserializing almost-empty documents. - Publish arm7l `manylinux_2_17` wheels to PyPI. - Publish amd4 `musllinux_1_1` wheels to PyPI. ### Fixed - Fix build requiring `python` on `PATH`. ## 3.6.6 - 2022-01-21 ### Changed - Improve performance of serializing `datetime.datetime` using `tzinfo` that are `zoneinfo.ZoneInfo`. ### Fixed - Fix invalid indexing in line and column number reporting in `JSONDecodeError`. - Fix `orjson.OPT_STRICT_INTEGER` not raising an error on values exceeding a 64-bit integer maximum. ## 3.6.5 - 2021-12-05 ### Fixed - Fix build on macOS aarch64 CPython 3.10. - Fix build issue on 32-bit. ## 3.6.4 - 2021-10-01 ### Fixed - Fix serialization of `dataclass` inheriting from `abc.ABC` and using `__slots__`. - Decrement refcount for numpy `PyArrayInterface`. - Fix build on recent versions of Rust nightly. ## 3.6.3 - 2021-08-20 ### Fixed - Fix build on aarch64 using the Rust stable channel. ## 3.6.2 - 2021-08-17 ### Changed - `orjson` now compiles on Rust stable 1.54.0 or above. Use of some SIMD usage is now disabled by default and packagers are advised to add `--cargo-extra-args="--features=unstable-simd"` to the `maturin build` command if they continue to use nightly. - `orjson` built with `--features=unstable-simd` adds UTF-8 validation implementations that use AVX2 or SSE4.2. - Drop support for Python 3.6. ## 3.6.1 - 2021-08-04 ### Changed - `orjson` now includes a `pyi` type stubs file. - Publish manylinux_2_24 wheels instead of manylinux2014. ### Fixed - Fix compilation on latest Rust nightly. ## 3.6.0 - 2021-07-08 ### Added - `orjson.dumps()` serializes `numpy.datetime64` instances as RFC 3339 strings. ## 3.5.4 - 2021-06-30 ### Fixed - Fix memory leak serializing `datetime.datetime` with `tzinfo`. - Fix wrong error message when serializing an unsupported numpy type without default specified. ### Changed - Publish python3.10 and python3.9 manylinux_2_24 wheels. ## 3.5.3 - 2021-06-01 ### Fixed - `orjson.JSONDecodeError` now has `pos`, `lineno`, and `colno`. - Fix build on recent versions of Rust nightly. ## 3.5.2 - 2021-04-15 ### Changed - Improve serialization and deserialization performance. - `orjson.dumps()` serializes individual `numpy.bool_` objects. ## 3.5.1 - 2021-03-06 ### Changed - Publish `universal2` wheels for macOS supporting Apple Silicon (aarch64). ## 3.5.0 - 2021-02-24 ### Added - `orjson.loads()` supports reading from `memoryview` objects. ### Fixed - `datetime.datetime` and `datetime.date` zero pad years less than 1000 to four digits. - sdist pins maturin 0.9.0 to avoid breaks in later 0.9.x. ### Changed - `orjson.dumps()` when given a non-C contiguous `numpy.ndarray` has an error message suggesting to use `default`. ## 3.4.8 - 2021-02-04 ### Fixed - aarch64 manylinux2014 wheels are now compatible with glibc 2.17. ### Changed - Fix build warnings on ppcle64. ## 3.4.7 - 2021-01-19 ### Changed - Use vectorcall APIs for method calls on python3.9 and above. - Publish python3.10 wheels for Linux on amd64 and aarch64. ## 3.4.6 - 2020-12-07 ### Fixed - Fix compatibility with debug builds of CPython. ## 3.4.5 - 2020-12-02 ### Fixed - Fix deserializing long strings on processors without AVX2. ## 3.4.4 - 2020-11-25 ### Changed - `orjson.dumps()` serializes integers up to a 64-bit unsigned integer's maximum. It was previously the maximum of a 64-bit signed integer. ## 3.4.3 - 2020-10-30 ### Fixed - Fix regression in parsing similar `dict` keys. ## 3.4.2 - 2020-10-29 ### Changed - Improve deserialization performance. - Publish Windows python3.9 wheel. - Disable unsupported SIMD features on non-x86, non-ARM targets ## 3.4.1 - 2020-10-20 ### Fixed - Fix `orjson.dumps.__module__` and `orjson.loads.__module__` not being the `str` "orjson". ### Changed - Publish macos python3.9 wheel. - More packaging documentation. ## 3.4.0 - 2020-09-25 ### Added - Serialize `numpy.uint8` and `numpy.int8` instances. ### Fixed - Fix serializing `numpy.empty()` instances. ### Changed - No longer publish `manylinux1` wheels due to tooling dropping support. ## 3.3.1 - 2020-08-17 ### Fixed - Fix failure to deserialize some latin1 strings on some platforms. This was introduced in 3.2.0. - Fix annotation of optional parameters on `orjson.dumps()` for `help()`. ### Changed - Publish `manylinux2014` wheels for amd64 in addition to `manylinux1`. ## 3.3.0 - 2020-07-24 ### Added - `orjson.dumps()` now serializes individual numpy floats and integers, e.g., `numpy.float64(1.0)`. - `orjson.OPT_PASSTHROUGH_DATACLASS` causes `orjson.dumps()` to pass `dataclasses.dataclass` instances to `default`. ## 3.2.2 - 2020-07-13 ### Fixed - Fix serializing `dataclasses.dataclass` that have no attributes. ### Changed - Improve deserialization performance of `str`. ## 3.2.1 - 2020-07-03 ### Fixed - Fix `orjson.dumps(..., **{})` raising `TypeError` on python3.6. ## 3.2.0 - 2020-06-30 ### Added - `orjson.OPT_APPEND_NEWLINE` appends a newline to output. ### Changed - Improve deserialization performance of `str`. ## 3.1.2 - 2020-06-23 ### Fixed - Fix serializing zero-dimension `numpy.ndarray`. ## 3.1.1 - 2020-06-20 ### Fixed - Fix repeated serialization of `str` that are ASCII-only and have a legacy (non-compact) layout. ## 3.1.0 - 2020-06-08 ### Added - `orjson.OPT_PASSTHROUGH_SUBCLASS` causes `orjson.dumps()` to pass subclasses of builtin types to `default` so the caller can customize the output. - `orjson.OPT_PASSTHROUGH_DATETIME` causes `orjson.dumps()` to pass `datetime` objects to `default` so the caller can customize the output. ## 3.0.2 - 2020-05-27 ### Changed - `orjson.dumps()` does not serialize `dataclasses.dataclass` attributes that begin with a leading underscore, e.g., `_attr`. This is because of the Python idiom that a leading underscores marks an attribute as "private." - `orjson.dumps()` does not serialize `dataclasses.dataclass` attributes that are `InitVar` or `ClassVar` whether using `__slots__` or not. ## 3.0.1 - 2020-05-19 ### Fixed - `orjson.dumps()` raises an exception if the object to be serialized is not given as a positional argument. `orjson.dumps({})` is intended and ok while `orjson.dumps(obj={})` is an error. This makes it consistent with the documentation, `help()` annotation, and type annotation. - Fix orphan reference in exception creation that leaks memory until the garbage collector runs. ### Changed - Improve serialization performance marginally by using the fastcall/vectorcall calling convention on python3.7 and above. - Reduce build time. ## 3.0.0 - 2020-05-01 ### Added - `orjson.dumps()` serializes subclasses of `str`, `int`, `list`, and `dict`. ### Changed - `orjson.dumps()` serializes `dataclasses.dataclass` and `uuid.UUID` instances by default. The options `OPT_SERIALIZE_DATACLASS` and `OPT_SERIALIZE_UUID` can still be specified but have no effect. ## 2.6.8 - 2020-04-30 ### Changed - The source distribution vendors a forked dependency. ## 2.6.7 - 2020-04-30 ### Fixed - Fix integer overflows in debug builds. ### Changed - The source distribution sets the recommended RUSTFLAGS in `.cargo/config`. ## 2.6.6 - 2020-04-24 ### Fixed - Import `numpy` only on first use of `OPT_SERIALIZE_NUMPY` to reduce interpreter start time when not used. - Reduce build time by half. ## 2.6.5 - 2020-04-08 ### Fixed - Fix deserialization raising `JSONDecodeError` on some valid negative floats with large exponents. ## 2.6.4 - 2020-04-08 ### Changed - Improve deserialization performance of floats by about 40%. ## 2.6.3 - 2020-04-01 ### Changed - Serialize `enum.Enum` objects. - Minor performance improvements. ## 2.6.2 - 2020-03-27 ### Changed - Publish python3.9 `manylinux2014` wheel instead of `manylinux1` for `x86_64`. - Publish python3.9 `manylinux2014` wheel for `aarch64`. ### Fixed - Fix compilation failure on 32-bit. ## 2.6.1 - 2020-03-19 ### Changed - Serialization is 10-20% faster and uses about 50% less memory by writing directly to the returned `bytes` object. ## 2.6.0 - 2020-03-10 ### Added - `orjson.dumps()` pretty prints with an indentation of two spaces if `option=orjson.OPT_INDENT_2` is specified. ## 2.5.2 - 2020-03-07 ### Changed - Publish `manylinux2014` wheels for `aarch64`. - numpy support now includes `numpy.uint32` and `numpy.uint64`. ## 2.5.1 - 2020-02-24 ### Changed - `manylinux1` wheels for 3.6, 3.7, and 3.8 are now compliant with the spec by not depending on glibc 2.18. ## 2.5.0 - 2020-02-19 ### Added - `orjson.dumps()` serializes `dict` keys of type other than `str` if `option=orjson.OPT_NON_STR_KEYS` is specified. ## 2.4.0 - 2020-02-14 ### Added - `orjson.dumps()` serializes `numpy.ndarray` instances if `option=orjson.OPT_SERIALIZE_NUMPY` is specified. ### Fixed - Fix `dataclasses.dataclass` attributes that are `dict` to be effected by `orjson.OPT_SORT_KEYS`. ## 2.3.0 - 2020-02-12 ### Added - `orjson.dumps()` serializes `dict` instances sorted by keys, equivalent to `sort_keys` in other implementations, if `option=orjson.OPT_SORT_KEYS` is specified. ### Changed - `dataclasses.dataclass` instances without `__slots__` now serialize faster. ### Fixed - Fix documentation on `default`, in particular documenting the need to raise an exception if the type cannot be handled. ## 2.2.2 - 2020-02-10 ### Changed - Performance improvements to serializing a list containing elements of the same type. ## 2.2.1 - 2020-02-04 ### Fixed - `orjson.loads()` rejects floats that do not have a digit following the decimal, e.g., `-2.`, `2.e-3`. ### Changed - Build Linux, macOS, and Windows wheels on more recent distributions. ## 2.2.0 - 2020-01-22 ### Added - `orjson.dumps()` serializes `uuid.UUID` instances if `option=orjson.OPT_SERIALIZE_UUID` is specified. ### Changed - Minor performance improvements. - Publish Python 3.9 wheel for Linux. ## 2.1.4 - 2020-01-08 ### Fixed - Specify a text signature for `orjson.loads()`. ### Changed - Improve documentation. ## 2.1.3 - 2019-11-12 ### Changed - Publish Python 3.8 wheels for macOS and Windows. ## 2.1.2 - 2019-11-07 ### Changed - The recursion limit of `default` on `orjson.dumps()` has been increased from 5 to 254. ## 2.1.1 - 2019-10-29 ### Changed - Publish `manylinux1` wheels instead of `manylinux2010`. ## 2.1.0 - 2019-10-24 ### Added - `orjson.dumps()` serializes `dataclasses.dataclass` instances if `option=orjson.OPT_SERIALIZE_DATACLASS` is specified. - `orjson.dumps()` accepts `orjson.OPT_UTC_Z` to serialize UTC as "Z" instead of "+00:00". - `orjson.dumps()` accepts `orjson.OPT_OMIT_MICROSECONDS` to not serialize the `microseconds` attribute of `datetime.datetime` and `datetime.time` instances. - `orjson.loads()` accepts `bytearray`. ### Changed - Drop support for Python 3.5. - Publish `manylinux2010` wheels instead of `manylinux1`. ## 2.0.11 - 2019-10-01 ### Changed - Publish Python 3.8 wheel for Linux. ## 2.0.10 - 2019-09-25 ### Changed - Performance improvements and lower memory usage in deserialization by creating only one `str` object for repeated map keys. ## 2.0.9 - 2019-09-22 ### Changed - Minor performance improvements. ### Fixed - Fix inaccurate zero padding in serialization of microseconds on `datetime.time` objects. ## 2.0.8 - 2019-09-18 ### Fixed - Fix inaccurate zero padding in serialization of microseconds on `datetime.datetime` objects. ## 2.0.7 - 2019-08-29 ### Changed - Publish PEP 517 source distribution. ### Fixed - `orjson.dumps()` raises `JSONEncodeError` on circular references. ## 2.0.6 - 2019-05-11 ### Changed - Performance improvements. ## 2.0.5 - 2019-04-19 ### Fixed - Fix inaccuracy in deserializing some `float` values, e.g., 31.245270191439438 was parsed to 31.24527019143944. Serialization was unaffected. ## 2.0.4 - 2019-04-02 ### Changed - `orjson.dumps()` now serializes `datetime.datetime` objects without a `tzinfo` rather than raising `JSONEncodeError`. ## 2.0.3 - 2019-03-23 ### Changed - `orjson.loads()` uses SSE2 to validate `bytes` input. ## 2.0.2 - 2019-03-12 ### Changed - Support Python 3.5. ## 2.0.1 - 2019-02-05 ### Changed - Publish Windows wheel. ## 2.0.0 - 2019-01-28 ### Added - `orjson.dumps()` accepts a `default` callable to serialize arbitrary types. - `orjson.dumps()` accepts `datetime.datetime`, `datetime.date`, and `datetime.time`. Each is serialized to an RFC 3339 string. - `orjson.dumps(..., option=orjson.OPT_NAIVE_UTC)` allows serializing `datetime.datetime` objects that do not have a timezone set as UTC. - `orjson.dumps(..., option=orjson.OPT_STRICT_INTEGER)` available to raise an error on integer values outside the 53-bit range of all JSON implementations. ### Changed - `orjson.dumps()` no longer accepts `bytes`. ## 1.3.1 - 2019-01-03 ### Fixed - Handle invalid UTF-8 in str. ## 1.3.0 - 2019-01-02 ### Changed - Performance improvements of 15-25% on serialization, 10% on deserialization. ## 1.2.1 - 2018-12-31 ### Fixed - Fix memory leak in deserializing dict. ## 1.2.0 - 2018-12-16 ### Changed - Performance improvements. ## 1.1.0 - 2018-12-04 ### Changed - Performance improvements. ### Fixed - Dict key can only be str. ## 1.0.1 - 2018-11-26 ### Fixed - pyo3 bugfix update. ## 1.0.0 - 2018-11-23 ### Added - `orjson.dumps()` function. - `orjson.loads()` function.