microsoft / microsoft/kiota-python
batch response bodies are dropped when they are JSON objects
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 31
- Forks
- 39
- Avg merge
- 11h 45m
- Merged PRs (30d)
- 42
Description
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.3microsoft-kiota-serialization-json: 1.12.3microsoft-kiota-http: 1.12.3msgraph-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
bodyis 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
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with src/msgraph_core/requests/batch_response_item.py at the body deserializer, then inspect JsonParseNode._get_bytes_value() in the kiota serialization JSON package and the BatchResponseContent flow. Reproduce a batch response whose individual body is a JSON object through BatchRequestBuilder; done means the object is retained in BatchResponseItem.body instead of becoming None.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 72/100