Я пытаюсь извлечь objectId и displayName из приведенного ниже результата http в формате JSON. Но я вообще не добился успеха. может кто-нибудь предложить мне извлечь objectId и displayName.
Мой код до сих пор:
var httpClient = new HttpClient
{
BaseAddress = new Uri("https://graph.windows.net/")
};
string URI = $"/{TenantID}/users?$filter=userPrincipalName%20eq%20'{EmailAddress}'&api-version=1.6";
httpClient.DefaultRequestHeaders.Remove("Authorization");
httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + MSGraphToken);
HttpResponseMessage response = await httpClient.GetAsync(URI).ConfigureAwait(false);
var HttpsResponse = await response.Content.ReadAsStringAsync();
dynamic Result = JsonConvert.DeserializeObject<object>(HttpsResponse);
UserDetails UserDetailsList = new UserDetails();
dynamic OdataResult = Result["value"];
if (Result != null)
{
UserDetailsList.DisplayName = OdataResult.displayName ?? "N/A";
UserDetailsList.ObjectID = OdataResult.objectId ?? "N/A";
}
return UserDetailsList;
JSON-результат:
{{
"value": [
{
"odata.type": "Microsoft.DirectoryServices.User",
"objectType": "User",
"objectId": "00000000-0000-0000-0000-000000000000",
"assignedPlans": [
{
"assignedTimestamp": "2022-09-06T20:38:49Z",
"capabilityStatus": "Enabled",
"service": "RMSOnline",
"servicePlanId": "00000000-0000-0000-0000-000000000000"
},
{
"assignedTimestamp": "2022-09-06T20:38:49Z",
"capabilityStatus": "Enabled",
"service": "Adallom",
"servicePlanId": "00000000-0000-0000-0000-000000000000"
},
],
"displayName": "Sachin Tendulkar (alt_sachint)",
"employeeId": "000000",
"userPrincipalName": "alt_sachint@pme.gbl.msidentity.com"
}
]
}}
Не могли бы вы предложить мне, как извлечь objectID из массива значений.
Почему вы используете «динамический», а не типизированный объект?
@ Винни, твоя проблема решена?
Да. это было решено вчера. Я забыл вернуться и отметить ответ. Я только что это сделал.
Прежде всего, ваш опубликованный JSON недействителен, я исправил его.
{
"value": [{
"odata.type": "Microsoft.DirectoryServices.User",
"objectType": "User",
"objectId": "00000000-0000-0000-0000-000000000000",
"assignedPlans": [{
"assignedTimestamp": "2022-09-06T20:38:49Z",
"capabilityStatus": "Enabled",
"service": "RMSOnline",
"servicePlanId": "00000000-0000-0000-0000-000000000000"
},
{
"assignedTimestamp": "2022-09-06T20:38:49Z",
"capabilityStatus": "Enabled",
"service": "Adallom",
"servicePlanId": "00000000-0000-0000-0000-000000000000"
}
],
"displayName": "Sachin Tendulkar (alt_sachint)",
"employeeId": "000000",
"userPrincipalName": "alt_sachint@pme.gbl.msidentity.com"
}]
}
Затем вы должны десериализовать json в объект класса.
Root obj = JsonConvert.DeserializeObject<Root>(myJsonResponse);
public class AssignedPlan
{
public DateTime assignedTimestamp { get; set; }
public string capabilityStatus { get; set; }
public string service { get; set; }
public string servicePlanId { get; set; }
}
public class Root
{
public List<Value> value { get; set; }
}
public class Value
{
[JsonProperty("odata.type")]
public string odatatype { get; set; }
public string objectType { get; set; }
public string objectId { get; set; }
public List<AssignedPlan> assignedPlans { get; set; }
public string displayName { get; set; }
public string employeeId { get; set; }
public string userPrincipalName { get; set; }
}
Таким образом, вы можете получить список значений с помощью obj.value
, который является списком Value
. Класс значений имеет свойства objectId
и employeeId
.
Вы можете использовать foreach
или for
или LINQ для получения этих свойств соответственно.
просто используйте Parse, если вам нужно получить только пару значений. В этом случае вам не нужно создавать классы
var json = await response.Content.ReadAsStringAsync();
var value = JObject.Parse(json)["value"];
string objectId = (string)value[0]["objectId"]; // 00000000-0000-0000-0000-000000000000
string displayName = (string)value[0]["displayName"]; // Sachin Tendulkar (alt_sachint)
и удалите лишний "{}" с краев вашего json
вы также можете использовать динамический, но я рекомендую использовать сильный тип
Логика получения значений
Using Strong Type
private void ReadJson()
{
string json = @"{""value"":[{""odata.type"":""Microsoft.DirectoryServices.User"",""objectType"":""User"",""objectId"":""00000000 - 0000 - 0000 - 0000 - 000000000000"",""assignedPlans"":[{""assignedTimestamp"":""2022 - 09 - 06T20: 38:49Z"",""capabilityStatus"":""Enabled"",""service"":""RMSOnline"",""servicePlanId"":""00000000 - 0000 - 0000 - 0000 - 000000000000""},{""assignedTimestamp"":""2022 - 09 - 06T20: 38:49Z"",""capabilityStatus"":""Enabled"",""service"":""Adallom"",""servicePlanId"":""00000000 - 0000 - 0000 - 0000 - 000000000000""},],""displayName"":""Sachin Tendulkar(alt_sachint)"",""employeeId"":""000000"",""userPrincipalName"":""alt_sachint @pme.gbl.msidentity.com""}]}";
var response = JsonConvert.DeserializeObject<Result>(json);
var objid = response.value[0].objectId;
var displayname = response.value[0].displayName;
// using for loop
foreach( var res in response.value)
{
objid = res.objectId;
displayname = res.displayName;
}
// you can use linq if you need object id and display name for specific condition
}
Классы
public class Result
{
public List<Response> value { get; set; }
}
public class Response
{
public string objectId { get; set; }
public string displayName { get; set; }
[JsonProperty("odata.type")]
public string odatatype { get; set; }
public string objectType { get; set; }
public List<AssignedPlan> assignedPlans { get; set; }
public string employeeId { get; set; }
public string userPrincipalName { get; set; }
}
public class AssignedPlan
{
public DateTime assignedTimestamp { get; set; }
public string capabilityStatus { get; set; }
public string service { get; set; }
public string servicePlanId { get; set; }
}
using dynamic
// 2. using dynamic
dynamic Result = JsonConvert.DeserializeObject<object>(json);
JArray jsonObject = JArray.FromObject(Result["value"]);
//JArray jsonObject = JArray.Parse(Result["value"]);
foreach (JObject content in jsonObject.Children<JObject>())
{
// you can get value from one of the approach
// 1. Approach
foreach (JProperty prop in content.Properties().Where(p => p.Name == "objectId"))
{
objid = prop.Value.ToString();
}
foreach (JProperty prop in content.Properties().Where(p => p.Name == "displayName"))
{
displayname = prop.Value.ToString();
}
// 2. Apprach
foreach (JProperty prop in content.Properties())
{
if (prop.Name == "objectId")
{
objid = prop.Value.ToString();
}
else if(prop.Name == "displayName")
{
displayname = prop.Value.ToString();
}
}
}
вы можете получить значение, следуя ответу @Serge, используя динамический, если это всегда один объект в ответе (узел значения), но согласно вашему образцу это массив, поэтому вам нужно использовать Jarray или цикл для получения каждого значения.
Значение представляет собой массив, но вы пытаетесь получить доступ к свойствам, как к одному объекту.