sco*_*ter 7 json.net system.text.json blazor-webassembly
我的理解是,当您在对象模型中定义循环引用时,您可以使用此设置来解决出现以下错误的问题:
JsonException: 检测到不支持的可能的对象循环。这可能是由于循环或对象深度大于最大允许深度 32。
但是,我无法成功实施它以使其正常工作。如果有人可以提供有关需要做什么的详细说明,将不胜感激!
我想将应用程序切换为使用 Newtonsoft.JSON,但从我读到的内容来看,这在 Blazor WebAssembly 应用程序中是不可行的?
2020 年 12 月 12 日更新
我在试图弄清楚如何实现 ReferenceHandler.Preserve 时发现的最接近的文章是这些:
https://github.com/dotnet/runtime/issues/42584
https://github.com/dotnet/aspnetcore/issues/28286
基于这些文章,我尝试实施以下解决方案,但都没有奏效......
第一次尝试我在我的 Server 项目的 Startup.cs 类中实现了以下代码:
services.AddControllersWithViews().AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.Preserve;
});
Run Code Online (Sandbox Code Playgroud)
第二次尝试我在我的服务器项目的 Startup.cs 类中实现了以下代码:
services.AddControllersWithViews(options =>
{
options.OutputFormatters.RemoveType<SystemTextJsonOutputFormatter>();
options.OutputFormatters.Add(new SystemTextJsonOutputFormatter(new JsonSerializerOptions(JsonSerializerDefaults.Web)
{
ReferenceHandler = ReferenceHandler.Preserve
}));
});
Run Code Online (Sandbox Code Playgroud)
更新 12/12/2020 上午 11:12 CST
在将我的服务器项目更改为面向 .NET 5 并尝试上面的两个代码选项后,我现在在我的应用程序的每个页面上都收到以下类型的错误:
Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常呈现组件:JSON 值无法转换为 BusinessManager.Shared.Models.EmploymentBenefit[]。路径:$ | 行号:0 | 字节位置内联:1。
重现原始问题的步骤
创建一个新的 Blazor WebAssembly 应用程序
在 Shared 项目中定义一个具有子对象集合的父类,如下所示:
public virtual List<Child> Children{ get; set; } = new List<Child>();
Run Code Online (Sandbox Code Playgroud)
在 Child 类中定义一个引用其父类的属性,如下所示:
public virtual Parent Parent{ get; set; }
Run Code Online (Sandbox Code Playgroud)
然后,我使用实体框架来生成数据库对象。创建一个返回父对象及其子对象的 web api 函数,如下所示:
[HttpGet("{id}")]
public async Task<IActionResult> Get(Guid id)
{
var returnValue = await db.Parents
.Include(aa => aa.Children)
.FirstOrDefaultAsync(aa => aa.ParentId== id);
return Ok(returnValue);
}
Run Code Online (Sandbox Code Playgroud)
然后尝试通过调用此 web api 函数在页面上呈现父子集合。
这就是我对我所做的。在 Startup.cs 中添加以下内容
services.AddMvc().AddJsonOptions(o =>
{
o.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1920 次 |
| 最近记录: |