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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy