Home > Enterprise >  Get all keys from combination of JArray and JObject
Get all keys from combination of JArray and JObject

Time:03-07

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

CodePudding user response:

RequestedObject is a property on the objects in the array, not the array itself.

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"],
    };

CodePudding user response:

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