Skip to content

Commit 1172610

Browse files
author
Evan Roman
committed
add jsonutils
1 parent 773c401 commit 1172610

File tree

2 files changed

+72
-1
lines changed

2 files changed

+72
-1
lines changed

azure/functions/_cosmosdb.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
# Licensed under the MIT License.
33

44
import collections
5-
import json
65

76
from . import _abc
7+
from ._jsonutils import json
88

99

1010
class Document(_abc.Document, collections.UserDict):

azure/functions/_jsonutils.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from abc import ABC, abstractmethod
2+
import types
3+
4+
5+
class JsonInterface(ABC):
6+
@abstractmethod
7+
def dumps(self, obj) -> str:
8+
pass
9+
10+
@abstractmethod
11+
def loads(self, s: str):
12+
pass
13+
14+
class OrJsonAdapter(JsonInterface):
15+
def __init__(self):
16+
import orjson
17+
self.orjson = orjson
18+
19+
def dumps(self, obj) -> str:
20+
return self.orjson.dumps(obj).decode("utf-8")
21+
22+
def loads(self, s: str):
23+
return self.orjson.loads(s)
24+
25+
26+
class UJsonAdapter(JsonInterface):
27+
def __init__(self):
28+
import ujson
29+
self.ujson = ujson
30+
31+
def dumps(self, obj) -> str:
32+
return self.ujson.dumps(obj)
33+
34+
def loads(self, s: str):
35+
return self.ujson.loads(s)
36+
37+
38+
class StdJsonAdapter(JsonInterface):
39+
def __init__(self):
40+
import json
41+
self.json = json
42+
43+
def dumps(self, obj, **kwargs) -> str:
44+
return self.json.dumps(obj, **kwargs)
45+
46+
def loads(self, s: str):
47+
return self.json.loads(s)
48+
49+
50+
json_impl = None
51+
for adapter_cls in (OrJsonAdapter, UJsonAdapter, StdJsonAdapter):
52+
try:
53+
json_impl = adapter_cls()
54+
break
55+
except ImportError:
56+
continue
57+
58+
def dumps(obj, **kwargs) -> str:
59+
if json_impl is None:
60+
raise ImportError("No JSON adapter found")
61+
return json_impl.dumps(obj, **kwargs)
62+
63+
def loads(s: str):
64+
if json_impl is None:
65+
raise ImportError("No JSON adapter found")
66+
return json_impl.loads(s)
67+
68+
json = types.SimpleNamespace(
69+
dumps=dumps,
70+
loads=loads
71+
)

0 commit comments

Comments
 (0)