582 字
3 分钟
记录一次System.Text.Json.JsonException
2024-05-05

记录一次System.Text.Json.JsonException#

最近有想开发一个个人博客系统,于是我创建了一个两个简单的实体类

Article.cs

public class Article : FullAuditedEntity<Guid>
{
public Article(Guid id, string title, string? content,
string coverImage, string classifyName,Guid classifyId, ArticleState state = ArticleState.Auditing, int collectCount = 0, int shareCount = 0,
int browseCount = 0, int supportCount = 0)
{
Title = title;
ClassifyId = classifyId;
BrowseCount = browseCount;
SupportCount = supportCount;
CollectCount = collectCount;
ShareCount = shareCount;
Content = content;
CoverImage = coverImage;
State = state;
ClassifyName = classifyName;
Id = id;
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public override Guid Id { get; protected set; }
/// <summary>
/// 文章标题
/// </summary>
[StringLength(100)]
public string Title { get; protected set; }
/// <summary>
/// 文章分类Id
/// </summary>
public Guid? ClassifyId { get; protected set; }
//public string ClassifyName { get; protected set; }
public Classify? Classify { get; set; }
/// <summary>
/// 浏览量
/// </summary>
public int BrowseCount { get; protected set; }
/// <summary>
/// 点赞数量
/// </summary>
public int SupportCount { get; protected set; }
/// <summary>
/// 收藏数量
/// </summary>
public int CollectCount { get; protected set; }
/// <summary>
/// 分享数量
/// </summary>
public int ShareCount { get; protected set; }
/// <summary>
/// 文章内容
/// </summary>
public string? Content { get; protected set; }
/// <summary>
/// 文章路径
/// </summary>
/// <value></value>
// [StringLength(64)]
// public string? ContentPath { get; set; }
/// <summary>
/// 封面图
/// </summary>
[StringLength(100)]
public string CoverImage { get; protected set; }
/// <summary>
/// 状态,0=待审核,1=审核中,2=审核通过,3=审核不通过
/// </summary>
public ArticleState State { get; protected set; }
}

Classify.cs

public class Classify : FullAuditedEntity<Guid>
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public override Guid Id { get; protected set; }
/// <summary>
/// 分类名称
/// </summary>
[StringLength(32)]
public string Name { get; set; }
/// <summary>
/// 是否显示在导航栏
/// </summary>
public bool IsShowNav { get; set; } = true;
public List<Article> Articles { get; set; }
protected Classify() { }
public Classify AddArticle(Guid id, string title, string? content, string coverImage,string classifyName)
{
if (Articles == null)
Articles = new List<Article>();
var article = new Article(id, title, content, coverImage,classifyName,this.Id);
Articles.Add(article);
return this;
}

并且在DbContext中也进行了一对多的关系配置

builder.Entity<Article>()
.HasOne(i => i.Classify)
.WithMany(i => i.Articles)
.HasForeignKey(i => i.ClassifyId)
.OnDelete(DeleteBehavior.ClientSetNull); //级联删除时给外键赋空值

然后我查询article的时候把classify给inclue进来,这时就会报错抛异常

System.Text.Json.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.

这个异常的原因是System.Text.Json默认是不支持这样的嵌套的,因为我Article里查询了classify,而classify里又有List

,导致了对象循环,解决方式是

在Program.cs 中添加一行代码

builder.Services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});

就可以完美解决这个问题

记录一次System.Text.Json.JsonException
https://www.tyblog.site/posts/csharp/json-exception/
作者
37°C
发布于
2024-05-05
许可协议
CC BY-NC-SA 4.0