【问题标题】:How to sort an Array of JObject?如何对 JObject 数组进行排序?
【发布时间】:2019-06-12 11:46:31
【问题描述】:

在我的代码中,我需要根据日期对 JObject 的数组进行排序。怎么做?我的数据如下所示,我需要将其按降序排序。

"His": [
        {
        "Date": "6/17/2019 6:00:00 PM",
        "StatusMsg": ""
    },
    {
        "Date": "6/17/2019 11:08:48 AM",
        "StatusMsg": ""
    },
    {
        "Date": "6/17/2019 7:38:00 AM",
        "StatusMsg": ""
    },
    {
        "Date": "6/17/2019 5:00:00 AM",
        "StatusMsg": ""
    },
    {
        "Date": "6/16/2019 6:16:00 PM",
        "StatusMsg": ""
    },
    {
        "Date": "6/15/2019 9:20:00 PM",
        "StatusMsg": ""
    },
    {
        "Date": "6/13/2019 2:00:00 PM",
        "StatusMsg": ""
    },
    {
        "Date": "6/13/2019 1:37:00 PM",
        "StatusMsg": ""
    },
    {
        "Date": "6/13/2019 2:39:00 AM",
        "StatusMsg": ""
    },
    {
        "Date": "6/13/2019 2:11:00 AM",
        "StatusMsg": ""
    },
    {
        "Date": "6/13/2019 2:08:00 AM",
        "StatusMsg": ""
    },
    {
        "Date": "6/12/2019 3:50:00 PM",
        "StatusMsg": ""
    }
    ]

我将结果分配给JObject。这是我的示例输入。任何人都试图帮助我。谢谢。

【问题讨论】:

  • 为什么不反序列化为常规对象模型,在其中可以使用所有常用工具? (除了使用起来不方便,像JObject这样的动态模型还有额外的开销,所以效率也很低)

标签: c# asp.net json c#-4.0


【解决方案1】:

就像 Marc 在问题 cmets 中所说的那样 - 为什么不使用常规课程:

public class Rootobject
{
    public His[] His { get; set; }
}

public class His
{
    public string Date { get; set; }
    public string StatusMsg { get; set; }
    public string Msg { get; set; }
    public string StatusDate { get; set; }
}

反序列化并利用 LINQ:

var json = "{\r\n\t\"His\": [\r\n        {\r\n            \"Date\": \"3/18/2019 6:30:45 PM\",\r\n            \"StatusMsg\": \"test3\"\r\n        },\r\n        {\r\n            \"Date\": \"3/21/2019 12:13:02 PM\",\r\n            \"Msg\": \"test2\"\r\n        },\r\n        {\r\n            \"StatusDate\": \"3/17/2019 9:26:00 AM\",\r\n            \"Msg\": \"test1\"\r\n        },\r\n    ]\r\n}";

var obj = JsonConvert.DeserializeObject<Rootobject>(json);

var sortedList = obj.His.OrderByDescending(o => o.Date).ToList();

编辑:如果你不想使用类,那么你可以这样做:

var json = "{\r\n\t\"His\": [{\r\n\t\t\t\"Date\": \"3/18/2019 6:30:45 PM\",\r\n\t\t\t\"StatusMsg\": \"test3\"\r\n\t\t}, {\r\n\t\t\t\"Date\": \"3/21/2019 12:13:02 PM\",\r\n\t\t\t\"Msg\": \"test2\"\r\n\t\t}, {\r\n\t\t\t\"Date\": \"3/17/2019 9:26:00 AM\",\r\n\t\t\t\"Msg\": \"test1\"\r\n\t\t},\r\n\t]\r\n}\r\n";

JObject jobj = JObject.Parse(json);

JArray array = jobj["His"];

JArray sorted = new JArray(array.OrderByDescending(obj => (DateTime)obj["Date"]));

这假设每个 JSON 对象将总是有一个名为“Date”的属性

【讨论】:

  • 别忘了用.OrderByDescending()代替.OrderBy()
  • 您不必转换为List&lt;T&gt;
  • 感谢大家的回复。如果我使用常规课程,我需要提及课程中的字段。但在这种情况下,键值对可能会改变。但固定字段是日期。这就是我想在没有常规类的情况下对对象进行排序的原因。
  • @SATHEESHP 但在您的示例中,您的最后一个对象没有“日期”但有“状态日期”?
  • @chris 它不工作。输出未按排序顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多