diff --git a/fiona/ogrext.pyx b/fiona/ogrext.pyx index 42528f8b..481d7cfd 100644 --- a/fiona/ogrext.pyx +++ b/fiona/ogrext.pyx @@ -412,14 +412,10 @@ cdef class JSONField(AbstractField): key = key_b.decode("utf-8") val = OGR_F_GetFieldAsString(feature, i) - # String(JSON) is the fallback for GDAL in the case of - # properties that are a mix of strings and numbers. See gh-1451. - # In GDAL 3.11, users will be able to override this and declare - # a field type. try: return json.loads(val) - except json.JSONDecodeError as error: - raise FieldError(f"String(JSON) field could not be decoded: {val=}, {error=}") + except json.JSONDecodeError: + return val cdef set(self, OGRFeatureH feature, int i, object value, object kwds): value_b = json.dumps(value).encode("utf-8") diff --git a/tests/test_geojson.py b/tests/test_geojson.py index c20f525d..e5b34a4d 100644 --- a/tests/test_geojson.py +++ b/tests/test_geojson.py @@ -164,3 +164,29 @@ def test_empty_array_property(tmp_path): ) ) list(fiona.open(tmp_path.joinpath("test.geojson"))) + +def test_json_field_property_with_mixed_types(tmp_path): + """Confirm fix for bug reported in gh-1470.""" + features = [ + { + "type": "Feature", + "properties": {"array_prop": []}, + "geometry": {"type": "Point", "coordinates": [12, 24]}, + }, + { + "type": "Feature", + "properties": {"array_prop": "a"}, + "geometry": {"type": "Point", "coordinates": [12, 24]}, + } + ] + for idx, f in enumerate([features, list(reversed(features))]): + fname = f"test_{idx}.geojson" + tmp_path.joinpath(fname).write_text( + json.dumps( + { + "type": "FeatureCollection", + "features": f, + } + ) + ) + list(fiona.open(tmp_path.joinpath(fname)))