Skip to content

Commit 0007be3

Browse files
authored
fix: json data type for non object values (#1236)
* fix: json data type for non object values * review comments
1 parent b2c69d4 commit 0007be3

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

google/cloud/spanner_v1/data_types.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,26 @@ class JsonObject(dict):
3131
def __init__(self, *args, **kwargs):
3232
self._is_null = (args, kwargs) == ((), {}) or args == (None,)
3333
self._is_array = len(args) and isinstance(args[0], (list, tuple))
34+
self._is_scalar_value = len(args) == 1 and not isinstance(args[0], (list, dict))
3435

3536
# if the JSON object is represented with an array,
3637
# the value is contained separately
3738
if self._is_array:
3839
self._array_value = args[0]
3940
return
4041

42+
# If it's a scalar value, set _simple_value and return early
43+
if self._is_scalar_value:
44+
self._simple_value = args[0]
45+
return
46+
4147
if len(args) and isinstance(args[0], JsonObject):
4248
self._is_array = args[0]._is_array
49+
self._is_scalar_value = args[0]._is_scalar_value
4350
if self._is_array:
4451
self._array_value = args[0]._array_value
52+
elif self._is_scalar_value:
53+
self._simple_value = args[0]._simple_value
4554

4655
if not self._is_null:
4756
super(JsonObject, self).__init__(*args, **kwargs)
@@ -50,6 +59,9 @@ def __repr__(self):
5059
if self._is_array:
5160
return str(self._array_value)
5261

62+
if self._is_scalar_value:
63+
return str(self._simple_value)
64+
5365
return super(JsonObject, self).__repr__()
5466

5567
@classmethod
@@ -76,6 +88,9 @@ def serialize(self):
7688
if self._is_null:
7789
return None
7890

91+
if self._is_scalar_value:
92+
return json.dumps(self._simple_value)
93+
7994
if self._is_array:
8095
return json.dumps(self._array_value, sort_keys=True, separators=(",", ":"))
8196

tests/unit/test_datatypes.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,56 @@ def test_w_JsonObject_of_list_of_dict(self):
4343
expected = json.dumps(data, sort_keys=True, separators=(",", ":"))
4444
data_jsonobject = JsonObject(JsonObject(data))
4545
self.assertEqual(data_jsonobject.serialize(), expected)
46+
47+
def test_w_simple_float_JsonData(self):
48+
data = 1.1
49+
expected = json.dumps(data)
50+
data_jsonobject = JsonObject(data)
51+
self.assertEqual(data_jsonobject.serialize(), expected)
52+
53+
def test_w_simple_str_JsonData(self):
54+
data = "foo"
55+
expected = json.dumps(data)
56+
data_jsonobject = JsonObject(data)
57+
self.assertEqual(data_jsonobject.serialize(), expected)
58+
59+
def test_w_empty_str_JsonData(self):
60+
data = ""
61+
expected = json.dumps(data)
62+
data_jsonobject = JsonObject(data)
63+
self.assertEqual(data_jsonobject.serialize(), expected)
64+
65+
def test_w_None_JsonData(self):
66+
data = None
67+
data_jsonobject = JsonObject(data)
68+
self.assertEqual(data_jsonobject.serialize(), None)
69+
70+
def test_w_list_of_simple_JsonData(self):
71+
data = [1.1, "foo"]
72+
expected = json.dumps(data, sort_keys=True, separators=(",", ":"))
73+
data_jsonobject = JsonObject(data)
74+
self.assertEqual(data_jsonobject.serialize(), expected)
75+
76+
def test_w_empty_list(self):
77+
data = []
78+
expected = json.dumps(data)
79+
data_jsonobject = JsonObject(data)
80+
self.assertEqual(data_jsonobject.serialize(), expected)
81+
82+
def test_w_empty_dict(self):
83+
data = [{}]
84+
expected = json.dumps(data)
85+
data_jsonobject = JsonObject(data)
86+
self.assertEqual(data_jsonobject.serialize(), expected)
87+
88+
def test_w_JsonObject_of_simple_JsonData(self):
89+
data = 1.1
90+
expected = json.dumps(data)
91+
data_jsonobject = JsonObject(JsonObject(data))
92+
self.assertEqual(data_jsonobject.serialize(), expected)
93+
94+
def test_w_JsonObject_of_list_of_simple_JsonData(self):
95+
data = [1.1, "foo"]
96+
expected = json.dumps(data, sort_keys=True, separators=(",", ":"))
97+
data_jsonobject = JsonObject(JsonObject(data))
98+
self.assertEqual(data_jsonobject.serialize(), expected)

0 commit comments

Comments
 (0)