从 JArray 和 JObject 的组合中获取所有键

Get all keys from combination of JArray and JObject

我是 JSON 的新手,查看了所有可能的答案,但仍然无法找到答案。基本上我正在获取所有用户的列表并将其存储为字符串。下面是结果 Json 输出字符串。

[{"Links":[],"RequestedObject":{"Id":181,"DisplayName":"User, Migration","FirstName":"Migration","MiddleName":null,"LastName":"User","LastLoginDate":"2008-01-10T11:04:00","UserName":"1564134","AccountStatus":2,"DomainId":null,"UpdateInformation":{"CreateDate":"2008-01-10T17:04:24.72","UpdateDate":"2011-10-07T16:35:51.74","CreateLogin":2,"UpdateLogin":2}},"IsSuccessful":true,"ValidationMessages":[]},{"Links":[],"RequestedObject":{"Id":16167,"DisplayName":"Xyz, Abc","FirstName":"Abc","MiddleName":null,"LastName":"Xyz","LastLoginDate":"2022-03-04T15:54:29.43","UserName":"1514834","AccountStatus":1,"DomainId":null,"UpdateInformation":{"CreateDate":"2022-03-04T15:53:14.817","UpdateDate":"2022-03-04T15:54:29.293","CreateLogin":14760,"UpdateLogin":11743}},"IsSuccessful":true,"ValidationMessages":[]}]

如您所见,第一部分是 JArray,然后是 Jobject。我的要求是获取所有“CreateDate”大于或等于 CurrentDate 的“RequestedObject”。有没有一种简单的方法可以使用 linq 而不是 foreach 循环来实现这一点。这是我能够从所有其他答案中输入的代码。

            try
            {
                string text = System.IO.File.ReadAllText(@"H:\Test.txt");
                DateTime previousRunTime = new DateTime(2022, 01, 31);
                JArray jsonArray = JArray.Parse(text);
                var jsonObjects = jsonArray.OfType<JObject>().ToList();
                //var users1 = from item in jsonObjects.Children()["RequestedObject"].Value<string>()
                //             select item;
                var abc = jsonObjects.Properties().Where(p => p.Name == "RequestedObject").Select(p => p.Value);
                    foreach(var q in abc)
                    {
                        Console.WriteLine(q.Value<string>("Id").ToString());
                    }
            }
            catch (Exception p)
            {
                Console.WriteLine(p.Message);
            }

正在寻找类似下面的解决方案

                    var users =
                        from item in jsonObjects["RequestedObject"]
                        where item["UpdateInformation"]["CreateDate"].Value<DateTime>() >= previousRunTime
                        select new UserDetails
                        {
                            UserName = item["UserName"].Value<string>(),
                            UserID = item["Id"].Value<string>(),
                        };

public class UserDetails
{
    public string UserName { get; set; }
    public string UserID { get; set; }
}

谢谢, 普雷姆

RequestedObject 是数组中对象的 属性,而不是数组本身。

var users =
    from item in jsonObjects
    let obj = item["RequestedObject"]
    where (DateTime)obj["UpdateInformation"]["CreateDate"] >= previousRunTime
    select new UserDetails
    {
        UserName = (string)obj["UserName"],
        UserID = (string)obj["Id"],
    };

如果您使用 LINQ to JSON

,您只需要一行代码
List<UserDetails> users = jsonArray.Where(i => (DateTime)i["RequestedObject"]
["UpdateInformation"]["CreateDate"] >= previousRunTime)
             .Select(i => i["RequestedObject"].ToObject<UserDetails>()).ToList();

class

public class UserDetails
{
    [JsonProperty("UserName")]
    public string UserName { get; set; }

    [JsonProperty("Id")]
    public string UserID { get; set; }
}