【问题标题】:How to sort serialized fields using System.Text.Json如何使用 System.Text.Json 对序列化字段进行排序
【发布时间】:2021-08-31 21:32:51
【问题描述】:

我想用 System.Text.Json 对序列化的属性进行排序。实际上,我想首先放置一个属性 (ID)。

关注我的控制台应用程序。

class Program
{
    static void Main(string[] args)
    {            
        Student student = new Student()
        {                
            Name = "Robert",
            Id = Guid.NewGuid(),
            LastName = "Alv",
            Check = "Ok"
        };

        var resultJson =  System.Text.Json.JsonSerializer.Serialize(student);
        Console.WriteLine(resultJson);
        Console.ReadLine();
        
    }
    class BaseClass1
    {            
        public Guid Id { get; set; }
    }

    class BaseClass2 : BaseClass1
    {
        
    }

    class People : BaseClass2
    {            
        public string Name { get; set; }
        public string LastName { get; set; }
        public string Check { get; set; }
    }

    class Student : BaseClass2
    {            
        public string Name { get; set; }
        public string LastName { get; set; }
        public string Check { get; set; }
    }       
}

  

上面程序的结果是 {"Name":"Robert","LastName":"Alv","Check":"Ok","Id":"4bd17c0c-f610-414d-8f6c-49ca8957ef3f" }

但我想要下面的结果

{"Id":"4bd17c0c-f610-414d-8f6c-49ca8957ef3f","Name":"Robert","LastName":"Alv","Check":"Ok"}

【问题讨论】:

  • 属性并没有真正的顺序......在 C# 和 JSON 中都没有。 (确实有structlayoutattribute,但它并不真正适用于文本序列化)。欢迎edit 澄清您的目标到底是什么,以及您希望用这种方法解决什么实际问题。
  • 你好@AlexeiLevenkov!实际上我需要它到我的 Rest Api。我想在 Json 结果中首先返回属性“ID”。但是由于许多原因,我的应用程序中需要带有“ID”的基类。
  • 如果您对您声称的内容感兴趣,您可能已经发现重复的 stackoverflow.com/questions/3330989/…... 但您需要基于标题/标签的自动映射器答案 - 所以现在有了明确的目标有人可能会想出并回答这个问题(我也很确定这是不可能的,因为 automapper 不知道 JSON 序列化)
  • 谢谢@AlexeiLevenkov!根据我的问题,如果我删除继承,属性顺序将正常工作。我已经检查了线程,它没有解决我的问题。
  • 您应该将edit 与真正的minimal reproducible example 一起放入问题中。 IE。目前该问题声称与 automapper 有某种关系,但没有在代码中使用映射结果的痕迹。也没有任何People 类型的定义...

标签: c# json asp.net-core system.text.json


【解决方案1】:

System.Text.Json 不可能(还)。据说在“某天”发布的作品中。

如您所见,使用 Newtonsoft.Json 是可能的。

【讨论】:

  • 我有点困惑;根据this,JsonPropertyOrderAttribute 是可用的,实际上我可以用它装饰我的 POCO 的属性(并且它可以编译),但是当从 web api 操作返回所述 POCO 时它不会影响排序。它应该与 .NET 6 一起使用吗?
  • IIRC 我也可以用JsonPropertyOrderAttribute 装饰属性,但它实际上并没有做任何事情。如果您查看该 GitHub 链接中的最后一条评论,他说该属性没有写入权限,无法修改对象的顺序。同一个人合并了一个相关的 PR here,但我认为这只是阻碍实际排序覆盖代码的众多障碍之一。我想。这可以解释为什么它仍然无法在 .NET 6 上运行。
  • 有道理;感谢您的见解
【解决方案2】:

在阅读@AlexeiLevenkov 指示的线程stackoverflow.com/questions/3330989 之后。我意识到使用 NewtonSoft.Json 更容易。所以我将属性 [JsonProperty(Order = -2)] 设置为“ID”属性并交换 System.Text.Json.JsonSerializer.Serialize(student) 为 JsonConvert.SerializeObject(student);它工作正常!

下面是更新的代码。

class Program
{
    static void Main(string[] args)
    {            
        Student student = new Student()
        {                
            Name = "Robert",
            Id = Guid.NewGuid(),
            LastName = "Alv",
            Check = "Ok"
        };

        var resultJson =  JsonConvert.SerializeObject(student);
        Console.WriteLine(resultJson);
        Console.ReadLine();
        
    }
    class BaseClass1
    {
        [JsonProperty(Order = -2)]
        public Guid Id { get; set; }
    }

    class BaseClass2 : BaseClass1
    {
        
    }

    class People : BaseClass2
    {            
        public string Name { get; set; }
        public string LastName { get; set; }
        public string Check { get; set; }
    }

    class Student : BaseClass2
    {            
        public string Name { get; set; }
        public string LastName { get; set; }
        public string Check { get; set; }
    }       
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多