A fleixible and fast wrapper around orjson for custom JSON encoding/decoding.
It basically copies the orjson API with some customized default behaviors.
| orjson | orjsonic | 
|---|---|
>>> import orjson
>>> orjson.loads('data/file/file_utf8.json')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
orjson.JSONDecodeError: unexpected character:
  line 1 column 1 (char 0) | 
>>> import orjsonic
>>> orjsonic.loads('data/file/file_utf8.json')
{'a': 1, 'b': 2} | 
| orjson | orjsonic | 
|---|---|
>>> import orjson
>>> data = '{"name": "小明"}'.encode('gbk')
>>> orjson.loads(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
orjson.JSONDecodeError: str is not valid UTF-8:
  surrogates not allowed:
    line 1 column 1 (char 0) | 
>>> import orjsonic
>>> data = '{"name": "小明"}'.encode('gbk')
>>> orjsonic.loads(data)
{'name': 'ะกร๗'}
>>> orjsonic.loads(data, encoding='gbk')
{'name': '小明'} | 
| orjson | orjsonic | 
|---|---|
>>> import orjson
>>> data = '{"name": "小明"}'.encode('gbk')
>>> orjson.loads(data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
orjson.JSONDecodeError: str is not valid UTF-8:
  surrogates not allowed:
    line 1 column 1 (char 0) | 
>>> import orjsonic
>>> data = '{"name": "小明"}'.encode('gbk')
>>> orjsonic.loads(data, errors='replace')
{'name': '��'} | 
| orjson | orjsonic | 
|---|---|
>>> import datetime
>>> import orjson
>>> data = dict(
>>>     datetime=datetime.datetime(
>>>         2025, 1, 2, 3, 4, 5, 678900
>>>     ),
>>>     date=datetime.date(2025, 1, 2),
>>>     time=datetime.time(3, 4, 5, 678900),
>>> )
>>> orjson.dumps(data)
b'{"datetime":"2025-01-02T03:04:05.678900",
"date":"2025-01-02","time":"03:04:05.678900"}'
>>> orjson.dumps(
>>>     data,
>>>     option=orjson.OPT_PASSTHROUGH_DATETIME
>>> )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Type is not JSON serializable:
  datetime.datetime | 
>>> import datetime
>>> import orjsonic
>>> data = dict(
>>>     datetime=datetime.datetime(
>>>         2025, 1, 2, 3, 4, 5, 678900
>>>     ),
>>>     date=datetime.date(2025, 1, 2),
>>>     time=datetime.time(3, 4, 5, 678900),
>>> )
>>> orjsonic.dumps(data)
b'{"datetime":"2025-01-02T03:04:05.678900",
"date":"2025-01-02","time":"03:04:05.678900"}'
>>> orjsonic.dumps(
>>>     data,
>>>     option=orjson.OPT_PASSTHROUGH_DATETIME
>>> )
b'{"datetime":"2025-01-02 03:04:05",
"date":"2025-01-02","time":"03:04:05"}'
>>> orjsonic.dumps(
>>>     data,
>>>     datetime_fmt='%Y%m%d%H%M%S',
>>>     date_fmt='%Y-%m-%d %H:%M:%S.%f',
>>>     time_fmt='%H:%M:%S.%f',
>>> )
b'{"datetime":"20250102030405",
"date":"2025-01-02 00:00:00.000000",
"time":"03:04:05."}' | 
| orjson | orjsonic | 
|---|---|
>>> import datetime
>>> import numpy as np
>>> import pandas as pd
>>> import orjson
>>> arr = np.array([
>>>     1,
>>>     np.datetime64('2025-01-02'),
>>>     np.datetime64('nat')
>>> ])
>>> s = pd.Series(arr).convert_dtypes()
>>> orjson.dumps(arr)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Type is not JSON serializable:
  numpy.ndarray
>>> orjson.dumps(
>>>     arr,
>>>     option=orjson.OPT_SERIALIZE_NUMPY
>>> )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported datatype in numpy array
>>> orjson.dumps(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Type is not JSON serializable:
  Series | 
>>> import datetime
>>> import numpy as np
>>> import pandas as pd
>>> import orjsonic
>>> arr = np.array([
>>>     1,
>>>     np.datetime64('2025-01-02'),
>>>     np.datetime64('nat')
>>> ])
>>> s = pd.Series(arr).convert_dtypes()
>>> orjsonic.dumps(arr)
b'[1,"2025-01-02",null]'
>>> orjson.dumps(s)
b'[1,"2025-01-02",null]' | 
| orjson | orjsonic | 
|---|---|
>>> import orjson
>>> ret_bytes = orjson.dumps(
>>>     {'a': 1, 'b': 2}
>>> )
>>> ret_bytes.decode()
'{"a":1,"b":2}'
>>> with open('output.json', 'wb') as f:
>>>     f.write(ret_bytes)
>>> with open('output.json', 'r') as f:
>>>     print(f.read())
{"a":1,"b":2} | 
>>> import orjsonic
>>> ret_str = orjsonic.dumps(
>>>     {'a': 1, 'b': 2},
>>>     output='output.json',
>>>     return_str=True
>>> )
>>> ret_str
'{"a":1,"b":2}'
>>> with open('output.json', 'r') as f:
>>>     print(f.read())
{"a":1,"b":2} |