ARTICLE AD BOX
I get the following exception when I use JsonSerializer.Deserialize in my Azure function. I created a small Azure function for testing purposes and it always fails with the same exception. Is it not possible to use JsonSerializer.Deserialize in my function DeleteAccountSendEmail?
What is the easiest way to solve this problem if I cannot use JsonSerializer.Deserialize because I always get an exception in this line(it is line 444 in my project in Visual Studio Code):
FunctionExecutionContext<dynamic> context = JsonSerializer.Deserialize<FunctionExecutionContext<dynamic>>(await req.ReadAsStringAsync());Full code:
using System; using System.Threading.Tasks; using System.Text.Json; using System.Collections.Generic; using PlayFab; using PlayFab.AdminModels; using System.IO; using System.Net; using PlayFab.Samples; using System.Linq; using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Extensions.Logging; namespace My.Functions { public class Result { public bool FunctionSuccessful { get; set; } public string Errorline1 { get; set; } public string Errorline2 { get; set; } public string Errorline3 { get; set; } public string Errorline4 { get; set; } public string Errorline5 { get; set; } public string Errorline6 { get; set; } public bool Isexpired { get; set; } public bool Isbanned { get; set; } public bool Zummenuweiterleitenmoeglich { get; set; } public string Entityid { get; set; } public string Entitytype { get; set; } public string Playersessionticket { get; set; } public string Playfabid { get; set; } public DateTime Playersessionticketexpdate { get; set; } } public class NewFunction { private readonly ILogger<NewFunction> log; public NewFunction(ILogger<NewFunction> logger) { log = logger; } [Function("DeleteAccountSendEmail")] public async Task<HttpResponseData> DeleteAccountSendEmail( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequestData req) { FunctionExecutionContext<dynamic> context = JsonSerializer.Deserialize<FunctionExecutionContext<dynamic>>(await req.ReadAsStringAsync()); var args = context.FunctionArgument; string language = args["Language"]; log.LogInformation($"MyLanguage = {language}"); string loginemail = args["Loginemail"]; log.LogInformation($" = {loginemail}"); bool updateaccountrecsuccessful = false; string errorline1 = string.Empty; string errorline2 = string.Empty; string errorline3 = string.Empty; string errorline4 = string.Empty; string errorline5 = string.Empty; string errorline6 = string.Empty; bool isbanned = false; bool isexpired = false; log.LogInformation($"FunctionSuccessful: = {updateaccountrecsuccessful}"); var result1 = new Result { FunctionSuccessful = updateaccountrecsuccessful, Errorline1 = string.Empty, Errorline2 = string.Empty, Errorline3 = string.Empty, Errorline4 = string.Empty, Errorline5 = string.Empty, Errorline6 = string.Empty, Isexpired = isexpired, Isbanned = isbanned }; var res1 = req.CreateResponse(HttpStatusCode.OK); res1.Headers.Add("Content-Type", "application/json"); await res1.WriteStringAsync(JsonSerializer.Serialize(result1)); return res1; } } }Executing 'Functions.DeleteAccountSendEmail' (Reason='This function was programmatically called via the host APIs.', Id=d09b0bb2-5bde-49fe-8a48-846a2e98fd29)
The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. LineNumber: 0 | BytePositionInLine: 0.
Result: Failure Type: Exception: System.Text.Json.JsonException: The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: 0 | BytePositionInLine: 0. ---> System.Text.Json.JsonReaderException: The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. LineNumber: 0 | BytePositionInLine: 0. at System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReader& json, ExceptionResource resource, Byte nextByte, ReadOnlySpan1 bytes) at System.Text.Json.Utf8JsonReader.Read() at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state) --- End of inner exception stack trace --- at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& state, JsonReaderException ex) at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan1 utf8Json, JsonTypeInfo1 jsonTypeInfo, Nullable1 actualByteCount) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan1 json, JsonTypeInfo1 jsonTypeInfo) at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options) at My.Functions.NewFunction.DeleteAccountSendEmail(HttpRequestData req) in C:\Users\Name\Documents\NewAzureFunctionsDevelopment\NewFunction.cs:line 444 at NewAzureFunctions.DirectFunctionExecutor.ExecuteAsync(FunctionContext context) in C:\Users\Name\Documents\NewAzureFunctionsDevelopment\obj\Release\net8.0\Microsoft.Azure.Functions.Worker.Sdk.Generators\Microsoft.Azure.Functions.Worker.Sdk.Generators.FunctionExecutorGenerator\GeneratedFunctionExecutor.g.cs:line 52 at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13 at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 96 at Microsoft.Azure.Functions.Worker.Handlers.InvocationHandler.InvokeAsync(InvocationRequest request) in D:\a_work\1\s\src\DotNetWorker.Grpc\Handlers\InvocationHandler.cs:line 88 Stack: at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStack& state, JsonReaderException ex) at System.Text.Json.Serialization.JsonConverter1.ReadCore(Utf8JsonReader& reader, JsonSerializerOptions options, ReadStack& state) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan1 utf8Json, JsonTypeInfo1 jsonTypeInfo, Nullable1 actualByteCount) at System.Text.Json.JsonSerializer.ReadFromSpan[TValue](ReadOnlySpan1 json, JsonTypeInfo1 jsonTypeInfo) at System.Text.Json.JsonSerializer.Deserialize[TValue](String json, JsonSerializerOptions options) at My.Functions.NewFunction.DeleteAccountSendEmail(HttpRequestData req) in C:\Users\Name\Documents\NewAzureFunctionsDevelopment\NewFunction.cs:line 444 at NewAzureFunctions.DirectFunctionExecutor.ExecuteAsync(FunctionContext context) in C:\Users\Name\Documents\NewAzureFunctionsDevelopment\obj\Release\net8.0\Microsoft.Azure.Functions.Worker.Sdk.Generators\Microsoft.Azure.Functions.Worker.Sdk.Generators.FunctionExecutorGenerator\GeneratedFunctionExecutor.g.cs:line 52 at Microsoft.Azure.Functions.Worker.OutputBindings.OutputBindingsMiddleware.Invoke(FunctionContext context, FunctionExecutionDelegate next) in D:\a_work\1\s\src\DotNetWorker.Core\OutputBindings\OutputBindingsMiddleware.cs:line 13 at Microsoft.Azure.Functions.Worker.FunctionsApplication.InvokeFunctionAsync(FunctionContext context) in D:\a_work\1\s\src\DotNetWorker.Core\FunctionsApplication.cs:line 96 at Microsoft.Azure.Functions.Worker.Handlers.InvocationHandler.InvokeAsync(InvocationRequest request) in D:\a_work\1\s\src\DotNetWorker.Grpc\Handlers\InvocationHandler.cs:line 88
I use this code to call my Azure function:
public static async Task<(bool isbanned, bool isexpired, bool addedcredentials, string errorline1, string errorline2, string errorline3, string errorline4, string errorline5, string errorline6)> DeleteAccountSendEmailAzure(this string language, string loginemail, string sessionticket, string deviceid, string entityid, string entitytype) { bool addedcredentials = false; string errorline1 = string.Empty; string errorline2 = string.Empty; string errorline3 = string.Empty; string errorline4 = string.Empty; string errorline5 = string.Empty; string errorline6 = string.Empty; bool isbanned = false; bool isexpired = false; var result = await PlayFabCloudScriptAPI.ExecuteFunctionAsync(new ExecuteFunctionRequest() { Entity = new PlayFab.CloudScriptModels.EntityKey() { Id = entityid, Type = entitytype, }, FunctionName = "DeleteAccountSendEmail", FunctionParameter = new { SessionTicket = sessionticket, Deviceid = deviceid, Loginemail = loginemail, Language = language }, GeneratePlayStreamEvent = true }); if (result.Error != null) { var errors = OnPlayFabError(result.Error, language); errorline1 = errors[0]; errorline2 = errors[1]; errorline3 = errors[2]; errorline4 = errors[3]; errorline5 = errors[4]; errorline6 = errors[5]; if (result.Error.Error == PlayFabErrorCode.NotAuthenticated) { isexpired = true; } if (result.Error.Error == PlayFabErrorCode.AccountBanned) { isbanned = true; } } else { var data = PlayFab.PluginManager.GetPlugin<ISerializerPlugin>(PluginContract.PlayFab_Serializer).DeserializeObject<Dictionary<string, object>>(result.Result.FunctionResult.ToString()); if (data.TryGetValue("functionSuccessful", out object a)) { addedcredentials = Convert.ToBoolean(a); } if (data.TryGetValue("errorline1", out object b)) { errorline1 = Convert.ToString(b); } if (data.TryGetValue("errorline2", out object c)) { errorline2 = Convert.ToString(c); } if (data.TryGetValue("errorline3", out object d)) { errorline3 = Convert.ToString(d); } if (data.TryGetValue("errorline4", out object e)) { errorline4 = Convert.ToString(e); } if (data.TryGetValue("errorline5", out object f)) { errorline5 = Convert.ToString(f); } if (data.TryGetValue("errorline6", out object g)) { errorline6 = Convert.ToString(g); } if (data.TryGetValue("isexpired", out object h)) { isexpired = Convert.ToBoolean(h); } if (data.TryGetValue("isbanned", out object i)) { isbanned = Convert.ToBoolean(i); } } return (isbanned, isexpired, addedcredentials, errorline1, errorline2, errorline3, errorline4, errorline5, errorline6); }EDIT:
I tried again to call my Azure function and here is what I found in my PlayFab account:
{ "SchemaVersion": "2.0.1", "FullName": { "Namespace": "playfab.functions", "Name": "function_executed" }, "Id": "ee1b53290a8a4cc9af3558058b92abb5", "Timestamp": "2025-12-30T22:41:18.2403127Z", "Entity": { "Id": "E90B78808A2382E0", "Type": "title_player_account" }, "EntityProfile": null, "Originator": { "Id": "E90B78808A2382E0", "Type": "title_player_account" }, "OriginInfo": { "Id": null, "Timestamp": null, "CustomTags": null, "Key": null }, "Context": null, "Payload": "{"Source":"API","FunctionName":"DeleteAccountSendEmail","ExecutionTimeMilliseconds":0,"Result":{"ErrorCode":"CloudScriptAzureFunctionsHTTPRequestError","Message":"Invocation of cloud script function DeleteAccountSendEmail failed with HTTP status InternalServerError and response body ","ErrorAndMessage":{"Item1":"CloudScriptAzureFunctionsHTTPRequestError","Item2":"Invocation of cloud script function DeleteAccountSendEmail failed with HTTP status InternalServerError and response body "}},"ResultTooLarge":false}", "EntityLineage": { "namespace": "4CE2E85814BA15CA", "title": "XXXXX", "master_player_account": "57440D2996790D06", "title_player_account": "E90B78808A2382E0" }, "PayloadContentType": 1, "ExperimentVariants": null }
