-
Notifications
You must be signed in to change notification settings - Fork 62
Description
🐛 Describe the bug
Azure Durable Functions Python SDK fails to serialize custom objects that implement a to_json()
method when returning from orchestrator functions. The error "Object of type [CustomClass] is not JSON serializable" is raised.
🤔 Expected behavior
Custom objects implementing a to_json()
method should be automatically serialized when returned from orchestrator functions.
☕ Steps to reproduce
Basic orchestration with custom return types.
- Create a custom class with
to_json()
andfrom_json()
methods:
from dataclasses import dataclass
import azure.durable_functions as df
import azure.functions as func
app = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@dataclass
class CustomResult():
message: str
success: bool = True
def to_json(self):
return {"message": self.message, "success": self.success}
@classmethod
def from_json(cls, data):
return cls(message=data["message"], success=data["success"])
@app.orchestration_trigger(context_name="context")
def orchestrator_function(context: df.DurableOrchestrationContext):
return CustomResult(message="Hello from orchestrator!", success=True)
@app.route(route="test", methods=["GET"])
@app.durable_client_input(client_name="client")
async def http_start_conversion(req: func.HttpRequest, client: df.DurableOrchestrationClient) -> func.HttpResponse:
instance_id = await client.start_new(
orchestration_function_name="orchestrator_function"
)
return client.create_check_status_response(req, instance_id)
- Execute the orchestration - it will fail with "Object of type CustomResult is not JSON serializable"
Environment: Running locally with
Azure Functions Core Tools Version: 4.1.0
azure-functions-durable: 1.3.2
Root cause: In TaskOrchestrationExecutor.get_orchestrator_state_str()
, the code calls dumps without a default argument:
azure-functions-durable-python/azure/durable_functions/models/TaskOrchestrationExecutor.py
Line 284 in 15ed958
json.dumps(self.output) |
But should call:
json.dumps(self._data, default=_serialize_custom_object)
as in other models or entities.
⚡If deployed to Azure
Didn't test yet. Since the bug is in the Python SDK code itself, I expect the same issue to occur.