簡體   English   中英

反序列化 Json .NET CORE 5 - JsonException 時出錯:檢測到可能的 object 循環不支持

[英]Error when deserialize Json .NET CORE 5 - JsonException: A possible object cycle was detected which is not supported

Basically I created a API Project on .NET 5. My idea was to get some Repositories informations on the GitHub API and then disponibilize some informations in MY API. 請求成功,但是在將 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);

瀏覽器返回此錯誤:

JsonException:檢測到可能的 object 循環。 這可能是由於循環或 object 深度大於最大允許深度 32。考慮在 JsonSerializerOptions 上使用 ReferenceHandler.Preserve 以支持循環。

我想了解為什么即使有兩個與 json 同名的簡單屬性也會出現錯誤

GitHub Api 文檔https://docs.ZBF215181B5140522137B3D4F6/restB735.

用作請求 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.安裝NewtonsoftJson package。

Install-Package Microsoft.AspNetCore.Mvc.NewtonsoftJson

2.在ConfigureServices中添加並配置。

services.AddControllers().AddNewtonsoftJson(options=>
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore);

3.使用JsonConvert反序列化。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM