System.Text.Json.JsonException: 输入不包含任何JSON令牌。

26

我只是尝试在Blazor应用程序中通过Http POST方式进行操作

public async Task CreateUnit(UnitEntity unit)
{
    await _http.PostJsonAsync<UnitEntity>("api/units", unit);
}

_http和myObject已经在其他地方定义,但我收到了这个奇怪的错误。有人能帮忙吗? 这是我在其他地方找到的最接近的东西:https://github.com/dotnet/runtime/issues/30945

完整的错误消息是

System.Text.Json.JsonException:输入不包含任何JSON令牌。 当isFinalBlock为true时,期望输入以有效的JSON令牌开头。 路径:$ | LineNumber: 0 | BytePositionInLine: 0。

以下是堆栈:

enter image description here


3
请发布MyObject初始化代码和类型。您不应该使用<MyType>,它应该可以使用:_http.PostJsonAsync("api/myRoute", myObject); - agua from mars
1
我已经在这里的顶部代码块中编辑了整个方法。我知道我使用的UnitEntity是有效的,因为它与我在DAL中进行测试时使用的相同,而不需要通过服务。我认为这可能与异步或序列化有关,但这只是一个猜测。 - Broad3857
2
奇怪的是,调试UI和服务都没有捕获到异常。它只在浏览器控制台中显示。 - Broad3857
1
你的服务返回一个 Json 对象吗?问题可能出在响应上。 - agua from mars
在我的情况下,我尝试读取Request.Body两次。解决方案:https://stackoverflow.com/questions/54442553/how-to-read-request-body-multiple-times-in-asp-net-core-2-2-middleware - undefined
15个回答

18

另一个导致这个错误出现的原因,就像我遇到的一样,是因为API端点不存在,可能是因为拼写错误。


9
Program.csMain方法中,我遇到了一个类似的错误CreateHostBuilder(args).Build();:

System.FormatException:“无法解析JSON文件。”

JsonReaderException:“输入不包含任何JSON标记。 当isFinalBlock为true时,期望输入以有效的JSON令牌开头。LineNumber:0|BytePositionInLine:0。”

对我来说,问题出在本地的secrets.json文件上,它没有包含有效的json对象。
因此,由于文件未被检入,我无法在Git中看到任何错误或回滚到工作提交的状态。
通过使用Visual Studio向文件添加一个空对象来解决这个问题 - 右键单击解决方案资源管理器中的项目并选择Manage User Secrets
参考:https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0&tabs=windows#secret-manager
{

}

https://learn.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0&tabs=windows#manage-user-secrets-with-visual-studio


7
在我的情况下,代码是这样做的:
var json = await response.Content.ReadAsStringAsync();
var result = JsonObject.Parse(json); // threw the exception mentioned in the question

为什么会发生这种情况?因为 json 值是空字符串 ""。由于是空字符串,解析失败

通过进行简单更改,已经解决了这个问题:

var json = await response.Content.ReadAsStringAsync();
var result = string.IsNullOrEmpty(json) ? null : JsonObject.Parse(json);

3
我遇到了类似的问题,问题在于检查你要读取的JSON字符串是否为空、null或格式错误。调试代码,找到将数据读入字符串之前进行反序列化或序列化调用的代码行。

3
我在这一行也遇到了同样的错误:CreateWebHostBuilder(args).Build().Run();
解决方法是在Visual Studio中右键单击项目文件,选择“管理密钥文件”选项,如果该文件(secret.json)为空,则将{}放入该文件中。

2

对我来说,当调用 UserManager 的 FindByNameAsync 时出现了这个错误。

听起来很傻,但是 appsettings 中的数据库连接字符串是错误的!


1

在两个API之间通信时,我遇到了这个错误。

request = await req.DeserializeRequestBodyAsync<MyDto>(jsonSerializerOptions);

结果发现下面的代码实际上没有发送任何值:

httpRequestMessage.Content = JsonContent.Create(myDto);
var httpClient = _clientFactory.CreateClient();
var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage, cancellationToken);

我必须手动指定:

await httpRequestMessage.Content.LoadIntoBufferAsync();

像这样:

httpRequestMessage.Content = JsonContent.Create(myDto);
await httpRequestMessage.Content.LoadIntoBufferAsync();
var httpClient = _clientFactory.CreateClient();
var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage, cancellationToken);

1

在客户端和 Web API 之间通信时发生了此错误。

API 代码:

public async Task<IActionResult> PostAsync(object review)
{
    return Ok();
}

客户端代码:

var res = await _client.PostAsJsonAsync("api/reviews", review);
if (res.IsSuccessStatusCode)
{
    var myObject = await res.Content.ReadFromJsonAsync<MyObject>(); //this line threw mentioned error
}

原来API端点返回的内容与我试图从JSON中读取的内容不同,即我试图读取MyObject,但API返回的是ActionResult

1
在我的情况下,我们的请求缺少了Content-Length头部,这个头部应该是你的JSON输入的长度。

1
晚回答了 - 但我在使用 Blazor WebAssembly 和浏览器链接时遇到了这个问题(尝试让热重载起作用)。结果发现这是一个加载 appsettings 的问题,而 Browser Link 却期望 secrets 文件。我通过右键单击服务器项目并将我的 appsettings 值复制/粘贴到 secrets 文件中来解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接