Извлечь значение из формата Json в С#

Я пытаюсь извлечь 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"
        }
      ]
    }}

Значение представляет собой массив, но вы пытаетесь получить доступ к свойствам, как к одному объекту.

Crowcoder 19.11.2022 14:14

Не могли бы вы предложить мне, как извлечь objectID из массива значений.

Vinny 19.11.2022 14:20

Почему вы используете «динамический», а не типизированный объект?

Aviran Ben David 19.11.2022 14:49

@ Винни, твоя проблема решена?

lets do it 22.11.2022 19:15

Да. это было решено вчера. Я забыл вернуться и отметить ответ. Я только что это сделал.

Vinny 23.11.2022 22:21
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
2
5
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Прежде всего, ваш опубликованный 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 или цикл для получения каждого значения.

Другие вопросы по теме