From b06ac4d5edc0c12c9b29a46b63ea4539a20ca8b7 Mon Sep 17 00:00:00 2001 From: RKS Date: Fri, 11 Sep 2026 12:04:04 -0400 Subject: [PATCH 1/2] fix(serialization-json): serialize nested arrays recursively --- .../json_serialization_writer.py | 5 +-- .../unit/test_json_serialization_writer.py | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py b/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py index f8efdffd..79b6c95b 100644 --- a/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py +++ b/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py @@ -488,10 +488,7 @@ def write_any_value(self, key: Optional[str], value: Any) -> Any: elif all(isinstance(x, dict) for x in value): self.__write_collection_of_dict_values(key, value) else: - raise TypeError( - f"Encountered an unknown collection type during serialization {type(value)}\ - with key {key}" - ) + self.write_collection_of_primitive_values(key, value) elif isinstance(value, dict): self.__write_dict_value(key, value) else: diff --git a/packages/serialization/json/tests/unit/test_json_serialization_writer.py b/packages/serialization/json/tests/unit/test_json_serialization_writer.py index a184f980..b2e2f3d9 100644 --- a/packages/serialization/json/tests/unit/test_json_serialization_writer.py +++ b/packages/serialization/json/tests/unit/test_json_serialization_writer.py @@ -1,3 +1,4 @@ +import json from datetime import date, datetime from uuid import UUID @@ -208,6 +209,40 @@ def test_write_collection_of_primitive_values(): assert content_string == '{"businessPhones": ["+1 412 555 0109", 1]}' +@pytest.mark.parametrize("key", [None, "matrix"]) +@pytest.mark.parametrize("value", [ + [[1, 2, 3]], + [[], [[1], [2, 3]]], + [1, [2, None], {"nested": [[], [3]]}, False], +]) +def test_write_any_value_nested_lists(key, value): + writer = JsonSerializationWriter() + writer.write_any_value(key, value) + expected = {key: value} if key else value + assert json.loads(writer.get_serialized_content()) == expected + + +def test_write_additional_data_nested_lists(): + writer = JsonSerializationWriter() + value = {"matrix": [[1, 2], [3, 4]]} + writer.write_additional_data_value(value) + assert json.loads(writer.get_serialized_content()) == value + + +def test_write_any_value_nested_lists_serializes_models(user_2): + writer = JsonSerializationWriter() + writer.write_any_value(None, [[user_2, date(2022, 1, 27)]]) + assert json.loads(writer.get_serialized_content()) == [ + [{"display_name": "John Doe", "age": 32}, "2022-01-27"] + ] + + +def test_write_any_value_nested_lists_rejects_unsupported_values(): + writer = JsonSerializationWriter() + with pytest.raises(TypeError): + writer.write_any_value(None, [[object()]]) + + def test_write_collection_of_object_values(user_1, user_2): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_collection_of_object_values("users", [user_1, user_2]) From ccbe1dde649cd00443c7777c1dcf8c030963d645 Mon Sep 17 00:00:00 2001 From: RKS Date: Fri, 11 Sep 2026 13:05:22 -0400 Subject: [PATCH 2/2] fix(serialization-json): preserve collection type validation --- .../json_serialization_writer.py | 7 ++++++- .../tests/unit/test_json_serialization_writer.py | 13 ++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py b/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py index 79b6c95b..f896777c 100644 --- a/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py +++ b/packages/serialization/json/kiota_serialization_json/json_serialization_writer.py @@ -487,8 +487,13 @@ def write_any_value(self, key: Optional[str], value: Any) -> Any: self.write_collection_of_primitive_values(key, value) elif all(isinstance(x, dict) for x in value): self.__write_collection_of_dict_values(key, value) - else: + elif all(isinstance(x, list) for x in value): self.write_collection_of_primitive_values(key, value) + else: + raise TypeError( + f"Encountered an unknown collection type during serialization {type(value)}\ + with key {key}" + ) elif isinstance(value, dict): self.__write_dict_value(key, value) else: diff --git a/packages/serialization/json/tests/unit/test_json_serialization_writer.py b/packages/serialization/json/tests/unit/test_json_serialization_writer.py index b2e2f3d9..207136c0 100644 --- a/packages/serialization/json/tests/unit/test_json_serialization_writer.py +++ b/packages/serialization/json/tests/unit/test_json_serialization_writer.py @@ -213,7 +213,7 @@ def test_write_collection_of_primitive_values(): @pytest.mark.parametrize("value", [ [[1, 2, 3]], [[], [[1], [2, 3]]], - [1, [2, None], {"nested": [[], [3]]}, False], + [[1, None], [False], [{"nested": [[], [3]]}]], ]) def test_write_any_value_nested_lists(key, value): writer = JsonSerializationWriter() @@ -231,9 +231,9 @@ def test_write_additional_data_nested_lists(): def test_write_any_value_nested_lists_serializes_models(user_2): writer = JsonSerializationWriter() - writer.write_any_value(None, [[user_2, date(2022, 1, 27)]]) + writer.write_any_value(None, [[user_2], [date(2022, 1, 27)]]) assert json.loads(writer.get_serialized_content()) == [ - [{"display_name": "John Doe", "age": 32}, "2022-01-27"] + [{"display_name": "John Doe", "age": 32}], ["2022-01-27"] ] @@ -243,6 +243,13 @@ def test_write_any_value_nested_lists_rejects_unsupported_values(): writer.write_any_value(None, [[object()]]) +@pytest.mark.parametrize("value", [[1, [2]], [{"value": 1}, [2]], [[1], None]]) +def test_write_any_value_rejects_mixed_collection_types(value): + writer = JsonSerializationWriter() + with pytest.raises(TypeError, match="Encountered an unknown collection type"): + writer.write_any_value(None, value) + + def test_write_collection_of_object_values(user_1, user_2): json_serialization_writer = JsonSerializationWriter() json_serialization_writer.write_collection_of_object_values("users", [user_1, user_2])