1

I need to get User Data from AAD (Azure Active Directory) through a daemon service. I have succeeded getting authorization and have downloaded the required userdata.

I cannot seem to get the data from the JSON file in a View. I have created a Model mimicking the JSON Properties. I get the JSON data as follows: string rawJson = await response.Content.ReadAsStringAsync(); When I try to deserialize it with GebruikersCollectie gebruikerscollectie = JsonConvert.DeserializeObject<GebruikersCollectie>(rawJson);, the result remains empty. I suspect the problem is in the '@data.context' property, but, I do not know how to solve this. The JSON file is as follows. How do I filter just the userdata and avoid the @odata.context?

{
{  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users", "value": 
[
{
"businessPhones": [],
"displayName": "John Doe", 
"givenName": "John",      
"jobTitle": "Owner",
"mail": "[email protected]",  
"mobilePhone": "+1 9 87654321", 
"officeLocation": Dullsville,      
"preferredLanguage": "en-US",
"surname": "Doe",
"userPrincipalName": "[email protected]",  
"id": "GUID number"    }, 

{      
"businessPhones": [],
"displayName": "SDK Test User", 
"givenName": null,  
"jobTitle": null,   
"mail": null,   
"mobilePhone": null, 
"officeLocation": null, 
"preferredLanguage": null, 
"surname": null, 
"userPrincipalName": "[email protected]", 
"id": "GUID"    } 
]
}}

My code is as follows: For my Index Controller:

public async Task<IActionResult> Index(string[] args)
    {
        // **************** Regel Authorisation *************************
        // Authorisation and token acquisition removed for simplicity
       //    {     ViewBag.TokenAcquired = "Token acquired";   

            if (result != null)
            {                    
                var httpClient = new HttpClient();
                var apiCaller = new ProtectedApiCallHelper(httpClient);
                await apiCaller.CallWebApiAndProcessResultASync("https://graph.microsoft.com/v1.0/users", result.AccessToken, Display);                    
                return View();                    
            }
        }            
        return View();
    }

private static void Display(GebruikersCollectie gebruikerscollectie)
    {

        View(gebruikerscollectie);                        


    }

The Method to get the JSON data is as follows:

public async Task CallWebApiAndProcessResultASync(string webApiUrl, string accessToken, Action<GebruikersCollectie> processResult)
    {
        if (!string.IsNullOrEmpty(accessToken))
        {
            var defaultRequetHeaders = HttpClient.DefaultRequestHeaders;
            if (defaultRequetHeaders.Accept == null || !defaultRequetHeaders.Accept.Any(m => m.MediaType == "application/json"))
            {
                HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));                    
            }
            defaultRequetHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
            HttpResponseMessage response = await HttpClient.GetAsync(webApiUrl);
            if (response.IsSuccessStatusCode)
            {                    
                string rawJson = await response.Content.ReadAsStringAsync();                    
                GebruikersCollectie gebruikerscollectie = JsonConvert.DeserializeObject<GebruikersCollectie>(rawJson);
                processResult(gebruikerscollectie);                 
            }

And here are the Models:

public class GebruikersCollectie
{
    public List<Gebruiker> gebruikers { get; set; }
}

public class Gebruiker
{

    public List<int> businessPhones { get; set; }        
    public string displayName { get; set; }
    public string givenName { get; set; }
    public string jobTitle { get; set; }
    public string mail { get; set; }
    public string mobilePhone { get; set; }
    public string officeLocation { get; set; }
    public string preferredLanguage { get; set; }
    public string surname { get; set; }
    public string userPrincipalName { get; set; }
    public string id { get; set; }
}   
2
  • Most likely the GebruikersCollectie model does not match the JSON. Can you share that model -- i.e. a minimal reproducible example? Commented Nov 25, 2019 at 18:25
  • @dbc I have included the models Commented Nov 25, 2019 at 20:51

1 Answer 1

1

I have found the answer in the documentation of NewtonSoft Serializing JSON Fragments

First you get the JsonString en convert it to a JObject

string rawJson = await response.Content.ReadAsStringAsync();
JObject jsonResult = JsonConvert.DeserializeObject(rawJson) as JObject;

In the Callback method from the apicaller you convert it to a .Net object with the help of JToken That is all.

Now I need to find a way to get it into a View. As the current method is void I need to find a way to get that working. Please comment on any thoughts.

private static void ZetKlaar(JObject jsonResult)
    {

        IList<JToken> resultaten = jsonResult["value"].Children().ToList();



        IList<Gebruiker> gebruikers = new List<Gebruiker>();            
        foreach (JToken resultaat in resultaten)
        {
            Gebruiker gebruiker = resultaat.ToObject<Gebruiker>();
            gebruikers.Add(gebruiker);
            //collectie.gebruikers.Add(gebruiker);                
        }

        Console.WriteLine(gebruikers);


    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.