What in your code is outputting the {"data": null, "errors": [...]} object? That seems to be treating the ValidationErrors as a string, but it needs to treat it as serde::Serialize.
What is the return type of the function you call udata.validate()? in, though? I'm assuming it's a Result<_, ValidationErrors> so that you can use ?. Somewhere, that ValidationErrors is being put into the object your API is returning. Without seeing the way you're using that function's return value it's difficult to tell what's going wrong.
It'd help if you could post more of the code here - the full definition of the function calling udata.validate(), what function calls that, etc.
I think what's happening is ? is converting the ValidationErrors into an async_graphql::Error using Display, which is why it's just displaying like you'd see in a standard debug. You'll have to intercept that and turn it into JSON yourself; try replacing
That will turn the error into a JSON string (it will panic if it couldn't turn it into JSON; if you don't want that, replace the unwrap with an unwrap_or_else provided with a function that turns a serde_json::Error into a String.
To note, this just embeds JSON in a string; it doesn't actually nest the error JSON. You'll get something like