@@ -72,14 +72,23 @@ class JSONArray(arrays.ArrowExtensionArray):
72
72
73
73
_dtype = JSONDtype ()
74
74
75
- def __init__ (self , values , dtype = None , copy = False ) -> None :
75
+ def __init__ (self , values ) -> None :
76
+ super ().__init__ (values )
76
77
self ._dtype = JSONDtype ()
77
78
if isinstance (values , pa .Array ):
78
- self . _pa_array = pa .chunked_array ([values ])
79
+ pa_data = pa .chunked_array ([values ])
79
80
elif isinstance (values , pa .ChunkedArray ):
80
- self . _pa_array = values
81
+ pa_data = values
81
82
else :
82
83
raise ValueError (f"Unsupported type '{ type (values )} ' for JSONArray" )
84
+
85
+ # Ensures compatibility with pandas version 1.5.3
86
+ if hasattr (self , '_data' ):
87
+ self ._data = pa_data
88
+ elif hasattr (self , '_pa_array' ):
89
+ self ._pa_array = pa_data
90
+ else :
91
+ raise ValueError (f"Unsupported pandas version: { pd .__version__ } " )
83
92
84
93
@classmethod
85
94
def _box_pa (
@@ -111,7 +120,7 @@ def _box_pa_scalar(cls, value) -> pa.Scalar:
111
120
def _box_pa_array (cls , value , copy : bool = False ) -> pa .Array | pa .ChunkedArray :
112
121
"""Box value into a pyarrow Array or ChunkedArray."""
113
122
if isinstance (value , cls ):
114
- pa_array = value ._pa_array
123
+ pa_array = value .pa_data
115
124
else :
116
125
value = [JSONArray ._serialize_json (x ) for x in value ]
117
126
pa_array = pa .array (value , type = cls ._dtype .pyarrow_dtype , from_pandas = True )
@@ -147,11 +156,20 @@ def dtype(self) -> JSONDtype:
147
156
"""An instance of JSONDtype"""
148
157
return self ._dtype
149
158
159
+ @property
160
+ def pa_data (self ):
161
+ """An instance of stored pa data"""
162
+ # Ensures compatibility with pandas version 1.5.3
163
+ if hasattr (self , '_data' ):
164
+ return self ._data
165
+ elif hasattr (self , '_pa_array' ):
166
+ return self ._pa_array
167
+
150
168
def _cmp_method (self , other , op ):
151
169
if op .__name__ == "eq" :
152
- result = pyarrow .compute .equal (self ._pa_array , self ._box_pa (other ))
170
+ result = pyarrow .compute .equal (self .pa_data , self ._box_pa (other ))
153
171
elif op .__name__ == "ne" :
154
- result = pyarrow .compute .not_equal (self ._pa_array , self ._box_pa (other ))
172
+ result = pyarrow .compute .not_equal (self .pa_data , self ._box_pa (other ))
155
173
else :
156
174
# Comparison is not a meaningful one. We don't want to support sorting by JSON columns.
157
175
raise TypeError (f"{ op .__name__ } not supported for JSONArray" )
@@ -169,7 +187,7 @@ def __getitem__(self, item):
169
187
else :
170
188
# `check_array_indexer` should verify that the assertion hold true.
171
189
assert item .dtype .kind == "b"
172
- return type (self )(self ._pa_array .filter (item ))
190
+ return type (self )(self .pa_data .filter (item ))
173
191
elif isinstance (item , tuple ):
174
192
item = indexers .unpack_tuple_and_ellipses (item )
175
193
@@ -181,7 +199,7 @@ def __getitem__(self, item):
181
199
r"(`None`) and integer or boolean arrays are valid indices"
182
200
)
183
201
184
- value = self ._pa_array [item ]
202
+ value = self .pa_data [item ]
185
203
if isinstance (value , pa .ChunkedArray ):
186
204
return type (self )(value )
187
205
else :
@@ -193,7 +211,7 @@ def __getitem__(self, item):
193
211
194
212
def __iter__ (self ):
195
213
"""Iterate over elements of the array."""
196
- for value in self ._pa_array :
214
+ for value in self .pa_data :
197
215
val = JSONArray ._deserialize_json (value .as_py ())
198
216
if val is None :
199
217
yield self ._dtype .na_value
0 commit comments