'Get all keys from combination of JArray and JObject

I'm new to JSON and looked at all the possible answers, but still not able to get it. Basically I'm getting the list of all users and storing it as string. Below is the result Json output string.

[{"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":[]}]

As you can see first part is JArray and then Jobject. My requirement is to get all "RequestedObject" that have "CreateDate" greater than or equal to CurrentDate. Is there a simple way to achieve this using linq instead of foreach loop. Here is code that I was able to put in from all other answers.

            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);
            }

Looking for solution something like below

                    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; }
}

Thanks, Prem



Solution 1:[1]

you need only one line code if you are using 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; }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Serge