Skip to content

Commit

Permalink
Don't fail on mixed typed JSONField
Browse files Browse the repository at this point in the history
  • Loading branch information
jbylina committed Dec 3, 2024
1 parent 8491f03 commit 33001a3
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 6 deletions.
8 changes: 2 additions & 6 deletions fiona/ogrext.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
26 changes: 26 additions & 0 deletions tests/test_geojson.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)))

0 comments on commit 33001a3

Please sign in to comment.