diff --git a/cirq-core/cirq/protocols/json_serialization.py b/cirq-core/cirq/protocols/json_serialization.py index 4a8b7b13830..e89a9e81c47 100644 --- a/cirq-core/cirq/protocols/json_serialization.py +++ b/cirq-core/cirq/protocols/json_serialization.py @@ -442,8 +442,15 @@ def has_serializable_by_keys(obj: Any) -> bool: # Handle primitive container types. if isinstance(obj, Dict): return any(has_serializable_by_keys(elem) for pair in obj.items() for elem in pair) + if hasattr(obj, '__iter__') and not isinstance(obj, str): - return any(has_serializable_by_keys(elem) for elem in obj) + # Return False on TypeError because some numpy values + # (like np.array(1)) have iterable methods + # yet return a TypeError when there is an attempt to iterate over them + try: + return any(has_serializable_by_keys(elem) for elem in obj) + except TypeError: + return False return False diff --git a/cirq-core/cirq/protocols/json_serialization_test.py b/cirq-core/cirq/protocols/json_serialization_test.py index 93fe6a2f93d..c10ace300a4 100644 --- a/cirq-core/cirq/protocols/json_serialization_test.py +++ b/cirq-core/cirq/protocols/json_serialization_test.py @@ -796,3 +796,12 @@ def custom_resolver(name): return QuantumVolumeParams assert_json_roundtrip_works(qvp, resolvers=[custom_resolver] + cirq.DEFAULT_RESOLVERS) + + +def test_numpy_values(): + assert ( + cirq.to_json({'value': np.array(1)}) + == """{ + "value": 1 +}""" + )