json.net 到 System.text.json 对 .net 5 中嵌套类的期望

Posted

技术标签:

【中文标题】json.net 到 System.text.json 对 .net 5 中嵌套类的期望【英文标题】:json.net to System.text.json desiration for nested class in .net 5 【发布时间】:2021-09-03 17:02:12 【问题描述】:

我遇到了问题。我已将 Json.net 迁移到 system.text.json。 非嵌套简单类类型的 Json 序列化和反序列化工作正常..

Json 请求:

"args":"pageIndex":1,"pageSize":10,"filteringOptions":[],"sortingOptions":["field":"ain","direction":"ASC"]

对于以下复杂类型的序列化正在出错..

 services.AddControllers()
            .AddJsonOptions(options =>
              
                  options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());  // Input/Output date format
              );

类:

 public class SearchPageRequest

    public PageSearchArgs Args  get; set;  = new PageSearchArgs();

 public class PageSearchArgs
                
       public int PageIndex  get; set; 
       public int PageSize  get; set; 
       public PagingStrategy PagingStrategy  get; set; 
       public List<SortingOption>? SortingOptions  get; set;    //Only List are not mapping 
       public List<FilteringOption>? FilteringOptions  get; set; 
    


 public class SortingOption
    
     
        public string Field  get; set;  = null!;
        //[JsonPropertyName("direction")]     tested put Json property for all propertie
        public SortingDirection Direction  get; set; 
        public int Priority  get; set; 

        public enum SortingDirection
        
            ASC,
            DESC
        
    

我在 C# 类(Pascal 案例)和 Angular 接口(Camelcase)中使用默认案例。 在 .net 5 和 angular 10 应用程序中。

模型验证出错。

键:“$.args.sortingOptions[0].direction”(驼峰式)

值:无法将 JSON 值转换为 Application.Wrappers.Paging.SortingOption+SortingDirection。路径:$.args.sortingOptions[0].direction |行号:0 | BytePositionInLine:109。

请让我知道..我正在尝试 2 天..来自 angular slickdrid 的数据..如果我必须在 c# 类 itlsef 中修改任何更改

我尝试过的:(在 json.net 中运行良好)

    Json 属性名我定义为驼峰式

基于错误 $.args.sortingOptions[0].direction 没有映射到方向的 SortingOptions。这是枚举属性。请告诉我替代解决方案?

【问题讨论】:

您为什么不与我们分享您尝试反序列化的原始 json?错误就是它所说的,它无法将 json 值转换为 SortingDirection 枚举的任何值。这可能是因为枚举成员不是您声称的 PascalCase,而是大写。 谢谢..如何使用 Angular 应用程序作为前端获取 rawJson i 使用浏览器网络日志查看请求正文。 这取决于您要达到的目标。如果您想将 .net json 序列化程序设置为不区分大小写,您可以这样做。或者可以选择在您的前端执行此操作。如果你把问题限制在这样的小问题上,你可以使用谷歌来解决它。或者有人可以帮助你。但是,当您的问题需要了解多个框架才能解决时,找到可以提供帮助的人的可能性会下降得很快。 是的,但现在您的排序方向将被忽略。但真正由你来定义“工作”。此外,您可以在 docs.microsoft.com/en-us/dotnet/standard/serialization/… 阅读有关反序列化不区分大小写的字符串和枚举的信息 【参考方案1】:

你真的需要将 Json.net 迁移到 system.text.json 吗?

根据https://visualstudiomagazine.com/articles/2020/07/28/json-serializers.aspx

如果您已经在现有项目中使用 Newtonsoft.Json,您 可能不需要切换。如果你绝对需要高 JSON 序列化/反序列化性能,搭配 System.Text。

Json.net 有一些方便的功能,在 System.Text 中没有。最好使用更适合工作的包。

【讨论】:

谢谢...现在我已经解决了使用 json 忽略的问题

以上是关于json.net 到 System.text.json 对 .net 5 中嵌套类的期望的主要内容,如果未能解决你的问题,请参考以下文章

如何将 json 属性添加到 Json.net 数组

将 Json.Net 添加到 Unity3D 项目

.NET Core - Json.NET反序列化映射

在 API 控制器中检测到 JSON.Net 自引用循环

将服务引用添加到引用了 JSON.NET 库的项目时出现奇怪的问题

Json.NET 反序列化或序列化 json 字符串并将属性映射到运行时定义的不同属性名称