summaryrefslogtreecommitdiff
path: root/jq.pyx
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-07-10 18:52:57 +0100
committerMichael Williamson <mike@zwobble.org>2026-07-10 18:52:57 +0100
commitcd7c501ed7bfb74cb88f074ae7e624d11444c6b1 (patch)
treeaca40fad4ef5d327e8888be674396cf9924afbc3 /jq.pyx
parent38e699b0de17d4238fdf42e925b1fae496c99247 (diff)
Don't raise errors from _jv_to_python()
Diffstat (limited to 'jq.pyx')
-rw-r--r--jq.pyx20
1 files changed, 15 insertions, 5 deletions
diff --git a/jq.pyx b/jq.pyx
index 0b8e6e6..0f674d2 100644
--- a/jq.pyx
+++ b/jq.pyx
@@ -106,9 +106,11 @@ cdef extern from "jq.h":
void jq_get_error_cb(jq_state *, jq_err_cb *, void **)
-cdef object _jv_to_python(jv value):
+cdef object _jv_to_python(jv value) noexcept:
"""Unpack a jv value into a Python value.
+ Invalid values are treated as nulls.
+
Consumes the input value."""
cdef jv_kind kind = jv_get_kind(value)
@@ -119,14 +121,17 @@ cdef object _jv_to_python(jv value):
cdef double number_value
if kind == JV_KIND_INVALID:
- jv_free(value)
- raise ValueError("Invalid value")
+ python_value = None
+
elif kind == JV_KIND_NULL:
python_value = None
+
elif kind == JV_KIND_FALSE:
python_value = False
+
elif kind == JV_KIND_TRUE:
python_value = True
+
elif kind == JV_KIND_NUMBER:
number_value = jv_number_value(value)
if number_value == INFINITY:
@@ -139,14 +144,17 @@ cdef object _jv_to_python(jv value):
python_value = int(number_value)
else:
python_value = number_value
+
elif kind == JV_KIND_STRING:
python_value = jv_string_to_py_string(value)
+
elif kind == JV_KIND_ARRAY:
python_value = []
length = jv_array_length(jv_copy(value))
for idx in range(0, length):
property_value = jv_array_get(jv_copy(value), idx)
python_value.append(_jv_to_python(property_value))
+
elif kind == JV_KIND_OBJECT:
python_value = {}
idx = jv_object_iter(value)
@@ -159,10 +167,12 @@ cdef object _jv_to_python(jv value):
python_value[python_property_key] = _jv_to_python(property_value)
idx = jv_object_iter_next(value, idx)
+
else:
- jv_free(value)
- raise ValueError("Invalid value kind: " + str(kind))
+ python_value = None
+
jv_free(value)
+
return python_value