【问题标题】:System.Text.Json.JsonException: The input does not contain any JSON tokensSystem.Text.Json.JsonException:输入不包含任何 JSON 标记
【发布时间】:2020-06-22 16:00:31
【问题描述】:

我只是想通过在 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 为真时,预期输入以有效的 JSON 令牌开头。路径:$ |行号:0 | BytePositionInLine: 0。

这是堆栈

【问题讨论】:

  • 发布 MyObject 初始化代码和类型。你不应该使用&lt;MyType&gt;,它应该使用:_http.PostJsonAsync("api/myRoute", myObject);
  • 我在这里的顶部代码块中编辑了整个方法。我知道我使用的 UnitEntity 是有效的,因为它与我在 DAL 中用于测试而无需通过服务的 UnitEntity 相同。我认为这可能与异步或序列化有关,但这只是猜测
  • 奇怪的是,调试 UI 和服务都没有发现异常。它只显示在浏览器控制台中
  • 您的服务是否返回 Json 对象?问题可能出在响应上

标签: json blazor json-deserialization json-serialization


【解决方案1】:

这个错误可能弹出的另一个原因,就像它对我一样,仅仅是因为 API 端点不存在,因为它拼写错误。

【讨论】:

    【解决方案2】:

    我在Program.cs Main 方法CreateHostBuilder(args).Build(); 中遇到了类似的错误:

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

    JsonReaderException:输入不包含任何 JSON 标记。 当 isFinalBlock 时,期望输入以有效的 JSON 令牌开头 是真的。行号:0 | BytePositionInLine: 0。

    对我来说,它原来是本地 secrets.json 文件,不包含有效的 json 对象。

    https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0&tabs=windows#secret-manager

    因此,我在 Git 中看不到任何错误或回滚到工作提交,因为该文件未签入。

    通过 Visual Studio 将空对象添加到文件中解决 - 在解决方案资源管理器中右键单击项目并选择 Manage User Secrets

    {
    
    }
    

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

    【讨论】:

      【解决方案3】:

      agua from mars 的评论是对的。这停止了​​错误,然后我设法忘记提交我的数据库事务,所以没有其他异常,但它没有进入数据库。不过现在一切都修复了:)

      【讨论】:

      • 这应该是您所指答案下的评论。 -1
      【解决方案4】:

      在两个 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);
      

      【讨论】:

        【解决方案5】:

        对我来说,这个错误是在调用 UserManager 的 FindByNameAsync 时发生的。

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

        【讨论】:

          【解决方案6】:

          迟到的答案 - 但我使用带有浏览器链接的 Blazor WebAssembly 遇到了这个问题(试图让热重载工作)。原来这是加载应用程序设置的问题,并且浏览器链接期待机密文件。我通过右键单击服务器项目并将我的 appsettings 值复制/粘贴到机密文件中来修复。

          【讨论】:

            【解决方案7】:

            在我的例子中,我将对象的 id 与对象本身一起在 put 请求的 url 中传递给 API,并且遇到了同样的异常。事实证明,没有必要传递 id(因为它是从对象本身检索的,实际上它不存在于方法签名中)。删除 id 解决了问题。

            【讨论】:

              【解决方案8】:

              我遇到了类似的问题,并且检查您准备的 json 字符串是否为空、null 或格式错误。在反序列化或序列化调用之前调试到您正在将数据读入字符串的代码行。

              【讨论】:

                猜你喜欢
                • 2022-07-26
                • 1970-01-01
                • 2020-07-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-04-24
                相关资源
                最近更新 更多