C # и REST - десериализация объекта JSON с неизвестной вложенностью (тип)

Я использую REST API, который возвращает строку JSON.

Пример документа:

{
  "kind": "collection#ExtendedACE",
  "selfLink": "https://1.2.3.4/api/access/in/Alohomora/rules",
  "rangeInfo": {
    "offset": 0,
    "limit": 3,
    "total": 3
  },
  "items": [
    {
      "kind": "object#ExtendedACE",
      "selfLink": "https://1.2.3.4/api/access/in/Alohomora/rules/2638577060",
      "permit": false,
      "sourceAddress": {
        "kind": "AnyIPAddress",
        "value": "any"
      },
      "destinationAddress": {
        "kind": "objectRef#NetworkObj",
        "refLink": "https://1.2.3.4/api/objects/networkobjects/facebook.com",
        "objectId": "facebook.com"
      },
      "sourceService": {
        "kind": "NetworkProtocol",
        "value": "tcp"
      },
      "destinationService": [
        {
          "kind": "TcpUdpService",
          "value": "tcp/http"
        },
        {
          "kind": "TcpUdpService",
          "value": "tcp/https"
        }
      ],
      "active": true,
      "remarks": [],
      "ruleLogging": {
        "logInterval": 300,
        "logStatus": "Default"
      },
      "position": 1,
      "isAccessRule": true,
      "objectId": "2638577060"
    },
    {
      "kind": "object#ExtendedACE",
      "selfLink": "https://1.2.3.4/api/access/in/Alohomora/rules/2115120101",
      "permit": false,
      "sourceAddress": {
        "kind": "objectRef#NetworkObjGroup",
        "refLink": "https://1.2.3.4/api/objects/networkobjectgroups/Hermiona-source",
        "objectId": "Hermiona-source"
      },
      "destinationAddress": {
        "kind": "objectRef#NetworkObjGroup",
        "refLink": "https://1.2.3.4/api/objects/networkobjectgroups/Hermiona-destination",
        "objectId": "Hermiona-destination"
      },
      "sourceService": {
        "kind": "NetworkProtocol",
        "value": "icmp"
      },
      "destinationService": {
        "kind": "NetworkProtocol",
        "value": "icmp"
      },
      "active": true,
      "remarks": [
        "Test Hermiona Alohomora kouzlo"
      ],
      "ruleLogging": {
        "logInterval": 300,
        "logStatus": "Default"
      },
      "position": 2,
      "isAccessRule": true,
      "objectId": "2115120101"
    },
  ]
}

Проблема в DestinationService , потому что я не знаю, как я могу написать объект для десериализации.

1 / Если я использую

var varAccessInRulesCollection = (new JavaScriptSerializer()).Deserialize<RootObject>(strAccessInRulesGet).items;

где публичный класс содержит список

public class Item
    {
        ...
        public List<DestinationService> destinationService { get; set; }
        ...
    }

результат - только первые элементы со сбором, второй элемент игнорируется (не анализируется)

2 / Если я использую

var varAccessInRulesCollection = (new JavaScriptSerializer()).Deserialize<RootObject>(strAccessInRulesGet).items;

где публичный класс содержит объект

public class Item
    {
        ...
        public object destinationService { get; set; }
        ...
    }

результат - только вторые элементы в виде массива, первый элемент игнорируется (не анализируется)

Существует какой-то код, как я могу сказать, что я хочу применить оба объекта с одинаковым именем, анализируя определение JSON? Или как эта проблема решена?

Спасибо петя

Всего 1 ответ


Вы можете использовать динамический тип

var json = JsonConvert.DeserializeObject<dynamic>(strAccessInRulesGet);
var items = json["items"];

Есть идеи?

10000