Как получить значения из этого JSON?

Возвращенный JSON из API выглядит так:

{
  "id": 191671,
  "callTrackingProfiles": {
    "1": {
      "destinationPhoneNumber": "8449000218",
      "phones": [
        {
          "phoneType": 3,
          "phoneNumber": "8443876176",
          "destinationWhisper": true,
          "callerWhisper": false,
          "isLocal": false,
          "recordCalls": false,
          "countryCode": "USA"
        },
        {
          "phoneType": 7,
          "phoneNumber": "8442692468",
          "destinationWhisper": true,
          "callerWhisper": false,
          "isLocal": false,
          "recordCalls": false,
          "countryCode": "USA"
        },
        {
          "phoneType": 10,
          "phoneNumber": "9493931848",
          "destinationWhisper": true,
          "callerWhisper": false,
          "isLocal": true,
          "recordCalls": false,
          "countryCode": "USA"
        }
      ]
    },
    "2": {
      "destinationPhoneNumber": "8449000218",
      "phones": [
        {
          "phoneType": 3,
          "phoneNumber": "9495283517",
          "destinationWhisper": true,
          "callerWhisper": false,
          "isLocal": true,
          "recordCalls": false,
          "countryCode": "USA"
        },
        {
          "phoneType": 7,
          "phoneNumber": "8443500663",
          "destinationWhisper": true,
          "callerWhisper": false,
          "isLocal": false,
          "recordCalls": false,
          "countryCode": "USA"
        }
      ]
    }
}

Теперь я десериализовал это:

dynamic jsonResults = JsonConvert.DeserializeObject<dynamic>(response);
var profiles = jsonResults.callTrackingProfiles;

И я могу использовать foreach для зацикливания.

Но как я могу получить значения целевого номера телефона и номера телефона?

foreach (var p in profiles)
{
    ...
    p.destinationPhoneNumber
    ...
}

Это не работает, и п. 1 имеет ошибку:

error CS1061: 'object' does not contain a definition for 'destinationPhoneNumber' and no accessible extension method 'destinationPhoneNumber' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)  

Спасибо

1
urlreader 28 Май 2019 в 21:45

2 ответа

Лучший ответ

Попробуйте создать несколько классов, которые определяют структуру вашего JSON:

public class RequestVm
{
    public long Id { get; set; }
    public Dictionary<string, CallTrackingProfileVm> callTrackingProfiles { get; set; }
}

public class CallTrackingProfileVm
{
    public string destinationPhoneNumber { get; set; }
    public List<PhoneNumberVm> phones { get; set; }
}

public class PhoneNumberVm
{
    public int phoneType { get; set; }
    public string phoneNumber { get; set; }
    public bool destinationWhisper { get; set; }
    public bool isLocal { get; set; }
    public bool recordCalls { get; set; }
    public string countryCode { get; set; }
}

Затем вы можете перебрать его так:

var jsonResults = JsonConvert.DeserializeObject<RequestVm>(str);
var profiles = jsonResults.callTrackingProfiles;
foreach(var value in profiles.Values)
{
    var phone = value.destinationPhoneNumber;
}
2
Slothario 28 Май 2019 в 19:16

Я предполагаю, что вы используете визуальные студии. Если так, то это самое простое на мой взгляд решение: 1. Создать класс c #. 2. Затем скопируйте весь свой JSON (из вашего примера). 3. Затем перейдите к тому классу, который вы создали ранее, и выберите «Правка»> «Специальная вставка»> «Вставить JSON как классы».

Это создаст для вас класс на основе этого JSON. Тогда все, что вам нужно сделать, это десериализовать его в этот тип класса, и он создаст объект, из которого вы сможете извлечь всю информацию. Надеюсь, это поможет!

http://blog.codeinside.eu/2014/09/08/Visual-Studio-2013-Paste-Special-JSON-And-Xml/

enter image description here

3
A.sharif 28 Май 2019 в 19:15