#json #json.net #blazor #blazor-webassembly
Вопрос:
Я встраиваю небольшую функцию прогнозирования в свое приложение. Столкнувшись с проблемой, которую я, кажется, не могу понять. Я вычисляю некоторые основные результаты и возвращаю словарь, содержащий 2 результата. Подумал, что это был бы хороший способ вернуть оба результата из одной функции вместо вызова двух. Я нашел некоторые предлагаемые решения для этой ошибки, такие как преобразование даты и времени в строку, но это тоже не сработало для меня. Был бы признателен за любое понимание причины ошибки. Заранее спасибо.
Ошибка
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100]
Unhandled exception rendering component: '<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
System.Text.Json.JsonException: '<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
---> System.Text.Json.JsonReaderException: '<' is an invalid start of a value. LineNumber: 0 | BytePositionInLine: 0.
at System.Text.Json.ThrowHelper.ThrowJsonReaderException(Utf8JsonReaderamp; json, ExceptionResource resource, Byte nextByte, ReadOnlySpan`1 bytes)
at System.Text.Json.Utf8JsonReader.ConsumeValue(Byte marker)
at System.Text.Json.Utf8JsonReader.ReadFirstToken(Byte first)
at System.Text.Json.Utf8JsonReader.ReadSingleSegment()
at System.Text.Json.Utf8JsonReader.Read()
at System.Text.Json.Serialization.JsonConverter`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReaderamp; reader, JsonSerializerOptions options, ReadStackamp; state)
--- End of inner exception stack trace ---
at System.Text.Json.ThrowHelper.ReThrowWithPath(ReadStackamp; state, JsonReaderException ex)
at System.Text.Json.Serialization.JsonConverter`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].ReadCore(Utf8JsonReaderamp; reader, JsonSerializerOptions options, ReadStackamp; state)
at System.Text.Json.JsonSerializer.ReadCore[Dictionary`2](JsonConverter jsonConverter, Utf8JsonReaderamp; reader, JsonSerializerOptions options, ReadStackamp; state)
at System.Text.Json.JsonSerializer.ReadCore[Dictionary`2](JsonReaderStateamp; readerState, Boolean isFinalBlock, ReadOnlySpan`1 buffer, JsonSerializerOptions options, ReadStackamp; state, JsonConverter converterBase)
at System.Text.Json.JsonSerializer.<ReadAsync>d__20`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
at System.Net.Http.Json.HttpContentJsonExtensions.<ReadFromJsonAsyncCore>d__3`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
at System.Net.Http.Json.HttpClientJsonExtensions.<GetFromJsonAsyncCore>d__9`1[[System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.Int32, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]], System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].MoveNext()
at WebApp.Client.Pages.Prediction.Predict.InitPrediction() in C:UserssourcereposWebAppWebAppClientPagesPredictionPredict.razor:line 48
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.Forms.EditForm.HandleSubmitAsync()
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle)
Эта ошибка начала возникать только тогда, когда я начал передавать переменную DateTime при выполнении запроса Get
Страница бритвы: проблематично
[CascadingParameter]
private DateTime selectedDate { get; set; } = new DateTime();
private Dictionary<string, int> predictedInfo = new Dictionary<string, int>();
private async Task InitPrediction()
{
predictedInfo = await http.GetFromJsonAsync<Dictionary<string, int>>($"Prediction/{selectedDate}");
Navigation.NavigateTo("/prediction");
}
Контроллер: проблема
[HttpGet("{date}")]
public async Task<ActionResult<Dictionary<string, int>>> GetProjects(DateTime date)
{
int total_projects_per_company = 0;
int users_per_project_sum = 0;
Dictionary<string, int> d = new Dictionary<string, int>();
// calculation code...
d.Add("users", users_per_project_sum);
d.Add("projects", total_projects_per_company);
return d;
}
Проблема не возникает, когда я не передаю дату-время, и я не уверен, какова корреляция между этим.
Страница бритвы: Не вызывает проблем
[CascadingParameter]
private DateTime selectedDate { get; set; } = new DateTime();
private Dictionary<string, int> predictedInfo = new Dictionary<string, int>();
private async Task InitPrediction()
{
predictedInfo = await http.GetFromJsonAsync<Dictionary<string, int>>("Prediction");
Navigation.NavigateTo("/prediction");
}
Контроллер: Не вызывает проблем
[HttpGet]
public async Task<ActionResult<Dictionary<string, int>>> GetProjects()
{
int total_projects_per_company = 0;
int users_per_project_sum = 0;
Dictionary<string, int> d = new Dictionary<string, int>();
// calculation code...
d.Add("users", users_per_project_sum);
d.Add("projects", total_projects_per_company);
return d;
}
Комментарии:
1. Ошибка указывает на то, что, скорее всего, вместо JSON возвращается HTML (почти наверняка одна из страниц ошибок по умолчанию). Вероятно, на сервере произошла какая-то ошибка, которая приводит к появлению страницы с ошибкой.
2.
'<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
означает, что<
символ был встречен как первый символ потока JSON. Это обычно указывает на то, что JSON на самом деле был HTML или XML, как упоминалось выше.3. Я не уверен, что могло бы вызвать ошибку на сервере. Все, что я сделал по-другому, — это ввел дату и время в функцию контроллера. Совсем запутался с этим
4. Приложению никогда не удается вызвать функцию на контроллере. Он попадает в строку
predictedInfo = await http.GetFromJsonAsync<Dictionary<string, int>>($"Prediction/{selectedDate}");
, выдает ошибку и останавливается. Функция на контроллере никогда не используется и не вызывается приложением5. @Krellex, используйте инструменты разработчика вашего браузера, чтобы изучить ответ сервера. Поскольку я ожидаю, что он будет содержать сообщение об ошибке, этого должно быть достаточно для диагностики вашей проблемы.