从JSON数组中查找最大值

mcdcgff0  于 2023-01-27  发布在  其他
关注(0)|答案(5)|浏览(227)

我有一个这样的JSON

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

我必须从assignments数组中找到第一个人的id,我使用了以下代码

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

但是现在我必须从数组中找到记录max hours的person_id,我可以执行foreach循环,然后找到max value,但是有没有直接的选项可用?

qxsslcnc

qxsslcnc1#

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

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

tcbh2hod2#

我尝试使用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来查询assignments下的每个节点。
我使用Row_Number()函数对分配的子行进行排序,并在main select中使用row_number()值为1的筛选条件
输出如下

kzmpq1sx

kzmpq1sx3#

使用以下代码:

public static void Main()
{
    var jObject = JObject.Parse(jsonString);  
    var assignments = JsonConvert.DeserilizeObject<Assignment[]>(lp_ask["assignments"].ToString());
    var assignment = assignments.OrderByDescending(i => i.hours_logged).FirstOrDefault();
}

private class Assignment
{
    public double hours_logged { get; set; }

    public int person_id { get; set; }
}
jaxagkaj

jaxagkaj4#

创建一个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;
}
py49o6xq

py49o6xq5#

这样做很容易,例如,如果你想在一个json字符串中找到某个标记的最大值,只需执行以下操作:

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

相关问题