【问题标题】:Get the three latest time json elements获取三个最晚时间的json元素
【发布时间】:2013-04-18 12:59:46
【问题描述】:

我有一个 json 数组。元素格式可能如下:

{
    "CKey": "S2_123_45_20130416105655",
    "TimeOfCall": "2013-04-17T06:00:00-04:00",
    "DestinationNumber": "123456789",
    "CallType": "X",
    "CardNumber": ""
}

数组中有很多元素,我只想要24小时内TimeOfCall(DateTime format)的最新三个订单。它们可能什么都不是,也可能是 1,2。最大值为 3。
原来我想用几个字典来存储和按值排序但是太复杂了。

更新:

此 json 数组来自 C# 代码的 json 字符串:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<CallDataDTO>));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(response4.Content.ReadAsStringAsync().Result));
calls = (List<CallDataDTO>)ser.ReadObject(ms); // dynamic
jsonStr4 = _dynamicConvert.DynamicToString(calls);// convert dynamic to string
jsonArray4 = JArray.Parse(jsonStr4); // convert string to a json array.

更新 2:

?jsonArray4
{[
   {
    "CKey": "P2_123_23_20130416105655",
    "TimeOfCall": "2013-04-17T06:00:00-04:00",
    "DestinationNumber": "1234567890",
    "CallType": "DEBIT",
    "CardNumber": ""
 },
 {
"CKey": "P5_123_105_20130412154035",
"TimeOfCall": "2013-04-17T07:00:00-04:00",
"DestinationNumber": "1234567890",
"CallType": "DEBIT",
"CardNumber": ""
},
{
  "CKey": "P5_123_114_20130412154000",
  "TimeOfCall": "2013-04-07T08:00:00-04:00",
  "DestinationNumber": "1234567890",
  "CallType": "DEBIT",
  "CardNumber": ""
}
]}
base {Newtonsoft.Json.Linq.JContainer}: {[
{
  "CKey": "P2_123_23_20130416105655",
  "TimeOfCall": "2013-04-17T06:00:00-04:00",
  "DestinationNumber": "1234567890",
  "CallType": "DEBIT",
  "CardNumber": ""
},
{
  "CKey": "P5_123_105_20130412154035",
  "TimeOfCall": "2013-04-17T07:00:00-04:00",
  "DestinationNumber": "1234567890",
  "CallType": "DEBIT",
  "CardNumber": ""
},
{
 "CKey": "P5_123_114_20130412154000",
 "TimeOfCall": "2013-04-07T08:00:00-04:00",
 "DestinationNumber": "1234567890",
 "CallType": "DEBIT",
 "CardNumber": ""
}
]}
 Type: Array

【问题讨论】:

  • 您希望多久执行一次此操作?如果不频繁,那么只需对数组进行排序并选择前 3 个。否则,请向我们提供有关您的数据结构及其使用方式的更多信息。
  • 很少这样做,我不知道如何对整个对象进行排序。我应该创建字典吗?
  • 这是一个对象数组吗?还是 JSON 文档?你的数据结构是什么?
  • 查看我的更新,可能是我将字符串转换为 json 数组的方法错误。
  • 同时发布整个 Json 文本(整个数组,而不仅仅是一个项目)

标签: json linq c#-4.0


【解决方案1】:

我会尝试类似的东西

jsonArray4.Where(item => Convert.ToDateTime(item["TimeOfCall"]).Date == DateTime.Now.Date)
.OrderByDescending(item => Convert.ToDateTime(item["TimeOfCall"]))
.Take(3);

更新:如果您需要过去 24 小时而不是当天:

jsonArray4.Where(item => Convert.ToDateTime(item["TimeOfCall"]) >= DateTime.Now.AddHours(-24))
.OrderByDescending(item => Convert.ToDateTime(item["TimeOfCall"]))
.Take(3);

Linq to Json

Update2:我之前的建议应该可行。这是我的完整代码示例:

string jsonText = @"[
{
    'CKey': 'P2_123_23_20130416105655',
    'TimeOfCall': '2013-04-17T06:00:00-04:00',
    'DestinationNumber': '1234567890',
    'CallType': 'DEBIT',
    'CardNumber': ''
},    
{
    'CKey': 'P5_123_105_20130412154035',
    'TimeOfCall': '2013-04-17T07:00:00-04:00',
    'DestinationNumber': '1234567890',
    'CallType': 'DEBIT',
    'CardNumber': ''
},
{
    'CKey': 'P5_123_114_20130412154000',
    'TimeOfCall': '2013-04-07T08:00:00-04:00',
    'DestinationNumber': '1234567890',
    'CallType': 'DEBIT',
    'CardNumber': ''
}    
]";

var result = JArray.Parse(jsonText).
    Where(item => Convert.ToDateTime(item["TimeOfCall"]).Date == new DateTime(2013, 4, 17))
    .OrderByDescending(item => Convert.ToDateTime(item["TimeOfCall"]))
    .Take(3);

请注意,我稍微改变了条件以实际返回一些东西。如果您只需要过去 24 小时的结果,请将条件更改为 >= DateTime.Now.AddHours(-24)

【讨论】:

  • 说实话我并不感到惊讶,我没有时间实际运行代码。但是,一旦我有时间,我会的。
  • 谢谢,不过我觉得linq不能不直接套json数组。
  • 可以,但是可能Json.Net的Linq实现有一些限制。一旦我不那么忙,我会更深入地研究这个。
  • 最后我有时间实际运行代码并且它工作正常(除了由于拼写错误导致的语法错误)。我建议您审查此案。
  • 您使用的是什么版本的 Json.Net?
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多