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

Я использую 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;

, где класс publi c содержит Список

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

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

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

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

, где класс publi c содержит объект

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

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

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

Спасибо, Петр

1 Ответ

0 голосов
/ 27 марта 2020

Вы можете использовать Dynami c тип

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