来自JSON Array的FInd Max值

时间:2018-05-23 08:28:23

标签: c# json json.net

我有像这样的JSON

    {
    "name": "Reporta",
    "assignments": [
        {
          "person_id": 638020,
          "hours_logged": 25.5
        },
        {
          "person_id": 638020,
          "hours_logged": 35.5
        }
    ]
    }

我必须从赋值数组中找到第一个人ID,并且我遵循此代码

    JObject lp_ask = JObject.Parse(response_json);
    int assignee = (int)lp_ask["assignments"][0]["person_id"];   

但是现在我必须找到从数组中记录最长时间的person_id。 我可以做一个foreach循环然后可以找到最大值,但是可以使用任何直接选项

4 个答案:

答案 0 :(得分:4)

最好的方法是反序列化为一组静态类,但如果你不想或不能这样做 - 你也可以查询原始JSON:

var person = lp_ask["assignments"]
    .OrderByDescending(c => c["hours_logged"].Value<double>())        
    .Select(c => c["person_id"].Value<int>())
    .First();

答案 1 :(得分:1)

我尝试使用SQL Server JSON支持(适用于SQL Server 2016及更高版本)在数据库级别上解决此问题

以下是我用于您的要求的示例查询

declare @json nvarchar(max) = '
    {
    "name": "Reporta",
    "assignments": [
        {
          "person_id": 638020,
          "hours_logged": 25.5
        },
        {
          "person_id": 638020,
          "hours_logged": 35.5
        }
    ]
    }
'
select 
    person_id, hours_logged
from (
    select
        JSON_VALUE(@json, '$.name') AS [name], 
        JSON_VALUE(@json, '$.assignments['+convert(varchar(2),i)+'].person_id')as person_id,
        JSON_VALUE(@json, '$.assignments['+convert(varchar(2),i)+'].hours_logged') AS hours_logged,
        row_number() over (order by JSON_VALUE(@json, '$.assignments['+convert(varchar(2),i)+'].hours_logged') desc) as rn
    from dbo.NumbersTable(0,10,1) n
) t
where rn = 1

请注意,我使用numbers table SQL function查询分配下的每个节点。

我使用Row_Number()函数对赋值的子行进行排序,在主要选择中使用row_number()值的过滤条件为1

输出如下

enter image description here

答案 2 :(得分:0)

创建一个可以反序列化为的POCO对象(Person_Id,Hours_Logged):

var reports = Jsonconvert.Deserialize<YourObjectName>(response_json);

然后你可以使用LINQ max函数:

var personWithMostHoursLogged = reports.Max(x => x.Hours_Logged);

编辑:这可能会对您有所帮助:

public IDictionary<string, object> DeserializeToDictionary(string input)
{
      dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(input);
      return (IDictionary<string, object>)obj;
}

答案 3 :(得分:0)

您可以轻松地通过这种方式进行操作,例如,如果您想在json字符串中找到某个令牌的最大值,只需执行以下操作:

int max = JObject.Parse(strJSON)
                .SelectTokens("$..recordDataNumber")
                .Select(s => s.Value<int>())
                .Max();