我有像这样的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循环然后可以找到最大值,但是可以使用任何直接选项
答案 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
输出如下
答案 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();