Summary
After upgrading to the Kiota Python version containing #646, batch responses from Microsoft Graph can no longer be deserialized correctly when an individual response body is a JSON object.
I am updating SharePoint list items in a batch request. The HTTP adapter returns the batch response body as a Python dict. During deserialization, BatchResponseItem passes that value to JsonParseNode.get_bytes_value(). The current _get_bytes_value() implementation only handles str values and returns None for dictionaries, so the response body is silently swallowed.
Before #646, non-string values were converted to a JSON string/UTF-8 byte sequence. That byte sequence was later parsed again as JSON, restoring the response body as a dictionary. #646 removed the non-string fallback needed for JSON object bodies.
This issue might originally stem from incorrect use of JsonParseNode in https://github.com/microsoftgraph/msgraph-sdk-python-core/blob/d23507bf38497aa514763f3ffa56b8ed8eceef70/src/msgraph_core/requests/batch_response_item.py#L159 but it didn't occur until the changes made in #646. If a fix should rather be made in msgraph-core, please let me know and I will raise the issue there.
Environment
- Python: 3.13
microsoft-kiota-bundle: 1.12.3
microsoft-kiota-serialization-json: 1.12.3
microsoft-kiota-http: 1.12.3
msgraph-core: 1.5.1
Reproduction
- Create a Microsoft Graph batch request containing SharePoint list-item updates.
- Send the request through
msgraph_core.requests.batch_request_builder.BatchRequestBuilder.
- Return a successful response whose individual
body is a JSON object.
- Deserialize the batch response as
BatchResponseContent.
The individual BatchResponseItem.body is expected to contain the JSON object, but it becomes None during deserialization.
Debugger call stack
I'm including a trace to where my app is hitting this regression.
Traceback (most recent call last):
File ".venv/Lib/site-packages/msgraph_core/requests/batch_request_builder.py", line 103, in _post_batch_collection
response = await self.post(batch_request_content, error_map)
File ".venv/Lib/site-packages/msgraph_core/requests/batch_request_builder.py", line 65, in post
response = await self._request_adapter.send_async(
File ".venv/Lib/site-packages/kiota_http/httpx_request_adapter.py", line 198, in send_async
value = root_node.get_object_value(parsable_factory)
File ".venv/Lib/site-packages/kiota_serialization_json/json_parse_node.py", line 213, in get_object_value
self._assign_field_values(result)
File ".venv/Lib/site-packages/kiota_serialization_json/json_parse_node.py", line 352, in _assign_field_values
field_deserializer(JsonParseNode(field_value))
File ".venv/Lib/site-packages/msgraph_core/requests/batch_response_content.py", line 156, in <lambda>
return {'responses': lambda n: set_responses(n)}
File ".venv/Lib/site-packages/msgraph_core/requests/batch_response_content.py", line 150, in set_responses
values = n.get_collection_of_object_values(BatchResponseItem)
File ".venv/Lib/site-packages/kiota_serialization_json/json_parse_node.py", line 153, in <lambda>
lambda x: self._create_new_node(x).get_object_value(factory),
File ".venv/Lib/site-packages/kiota_serialization_json/json_parse_node.py", line 213, in get_object_value
self._assign_field_values(result)
File ".venv/Lib/site-packages/kiota_serialization_json/json_parse_node.py", line 352, in _assign_field_values
field_deserializer(JsonParseNode(field_value))
File ".venv/Lib/site-packages/msgraph_core/requests/batch_response_item.py", line 159, in <lambda>
"body": lambda x: setattr(self, "body", x.get_bytes_value()),
File ".venv/Lib/site-packages/kiota_serialization_json/json_parse_node.py", line 223, in get_bytes_value
return self._get_bytes_value(self._json_node)
File ".venv/Lib/site-packages/kiota_serialization_json/json_parse_node.py", line 296, in _get_bytes_value
return None
Summary
After upgrading to the Kiota Python version containing #646, batch responses from Microsoft Graph can no longer be deserialized correctly when an individual response body is a JSON object.
I am updating SharePoint list items in a batch request. The HTTP adapter returns the batch response body as a Python
dict. During deserialization,BatchResponseItempasses that value toJsonParseNode.get_bytes_value(). The current_get_bytes_value()implementation only handlesstrvalues and returnsNonefor dictionaries, so the response body is silently swallowed.Before #646, non-string values were converted to a JSON string/UTF-8 byte sequence. That byte sequence was later parsed again as JSON, restoring the response body as a dictionary. #646 removed the non-string fallback needed for JSON object bodies.
This issue might originally stem from incorrect use of
JsonParseNodein https://github.com/microsoftgraph/msgraph-sdk-python-core/blob/d23507bf38497aa514763f3ffa56b8ed8eceef70/src/msgraph_core/requests/batch_response_item.py#L159 but it didn't occur until the changes made in #646. If a fix should rather be made in msgraph-core, please let me know and I will raise the issue there.Environment
microsoft-kiota-bundle: 1.12.3microsoft-kiota-serialization-json: 1.12.3microsoft-kiota-http: 1.12.3msgraph-core: 1.5.1Reproduction
msgraph_core.requests.batch_request_builder.BatchRequestBuilder.bodyis a JSON object.BatchResponseContent.The individual
BatchResponseItem.bodyis expected to contain the JSON object, but it becomesNoneduring deserialization.Debugger call stack
I'm including a trace to where my app is hitting this regression.