反序列化时出错 Json .NET CORE 5 - Json异常:检测到不支持的可能对象循环
Error when deserialize Json .NET CORE 5 - JsonException: A possible object cycle was detected which is not supported
基本上我在 .NET 5 上创建了一个 API 项目。我的想法是在 GitHub API 上获取一些存储库信息,然后在我的 [=38] 中取消一些信息=].请求成功但是,但是在将Json转换为object
时总是出现同样的错误
存储库控制器:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Threading.Tasks;
[ApiController]
[Route("[controller]")]
public class RepositoriesController : ControllerBase
{
private static readonly HttpClient client = new HttpClient();
private readonly ILogger<RepositoriesController> _logger;
public RepositoriesController(ILogger<RepositoriesController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult Get(string number)
{
return Ok(ProcessRepositories());
}
private static async Task ProcessRepositories()
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json"));
client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter");
var streamTask = client.GetStreamAsync("https://api.github.com/orgs/dotnet/repos?sort=created&per_page=5&direction=desc");
var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(await streamTask);
}
}
类存储库:
public class Repository
{
public string full_name { get; set; }
public string node_id { get; set; }
//public string description { get; set; }
}
但总是在这部分:
var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(await streamTask);
浏览器return这个错误:
JsonException: A possible object cycle was detected. This can either
be due to a cycle or if the object depth is larger than the maximum
allowed depth of 32. Consider using ReferenceHandler.Preserve on
JsonSerializerOptions to support cycles.
我想了解为什么即使有两个与 json
同名的简单属性也会出现错误
GitHub Api 文档
https://docs.github.com/en/rest/reference/repos
用作请求 api 基础的文档:
https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/console-webapiclient#deserialize-the-json-result
Github返回Json(我隐藏了json的一些属性,因为有几个)
[
{
"id": 1296269,
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
"name": "Hello-World",
"full_name": "octocat/Hello-World",
[... several hidden properties for display purposes]
}
]
提前致谢:)
我建议切换到 Newtonsoft.Json 来处理循环引用问题。
1.Install NewtonsoftJson 包。
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
2.Add并在ConfigureServices中进行配置。
services.AddControllers().AddNewtonsoftJson(options=>
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
3.Use Json转换为反序列化。
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json"));
client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter");
var streamTask = await client.GetStringAsync("https://api.github.com/orgs/dotnet/repos?sort=created&per_page=5&direction=desc");
var repositories = JsonConvert.DeserializeObject<List<Repository>>(streamTask);
基本上我在 .NET 5 上创建了一个 API 项目。我的想法是在 GitHub API 上获取一些存储库信息,然后在我的 [=38] 中取消一些信息=].请求成功但是,但是在将Json转换为object
时总是出现同样的错误存储库控制器:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Threading.Tasks;
[ApiController]
[Route("[controller]")]
public class RepositoriesController : ControllerBase
{
private static readonly HttpClient client = new HttpClient();
private readonly ILogger<RepositoriesController> _logger;
public RepositoriesController(ILogger<RepositoriesController> logger)
{
_logger = logger;
}
[HttpGet]
public IActionResult Get(string number)
{
return Ok(ProcessRepositories());
}
private static async Task ProcessRepositories()
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json"));
client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter");
var streamTask = client.GetStreamAsync("https://api.github.com/orgs/dotnet/repos?sort=created&per_page=5&direction=desc");
var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(await streamTask);
}
}
类存储库:
public class Repository
{
public string full_name { get; set; }
public string node_id { get; set; }
//public string description { get; set; }
}
但总是在这部分:
var repositories = await JsonSerializer.DeserializeAsync<List<Repository>>(await streamTask);
浏览器return这个错误:
JsonException: A possible object cycle was detected. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32. Consider using ReferenceHandler.Preserve on JsonSerializerOptions to support cycles.
我想了解为什么即使有两个与 json
同名的简单属性也会出现错误GitHub Api 文档 https://docs.github.com/en/rest/reference/repos
用作请求 api 基础的文档: https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/console-webapiclient#deserialize-the-json-result
Github返回Json(我隐藏了json的一些属性,因为有几个)
[
{
"id": 1296269,
"node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
"name": "Hello-World",
"full_name": "octocat/Hello-World",
[... several hidden properties for display purposes]
}
]
提前致谢:)
我建议切换到 Newtonsoft.Json 来处理循环引用问题。
1.Install NewtonsoftJson 包。
Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson
2.Add并在ConfigureServices中进行配置。
services.AddControllers().AddNewtonsoftJson(options=>
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);
3.Use Json转换为反序列化。
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/vnd.github.v3+json"));
client.DefaultRequestHeaders.Add("User-Agent", ".NET Foundation Repository Reporter");
var streamTask = await client.GetStringAsync("https://api.github.com/orgs/dotnet/repos?sort=created&per_page=5&direction=desc");
var repositories = JsonConvert.DeserializeObject<List<Repository>>(streamTask);