Как декодировать динамический вложенный JSON в Swift - PullRequest
0 голосов
/ 27 октября 2019

Я пытался декодировать JSON из серверной системы.

    {
        "Inst1": [
            {
                "symbol": "Inst1",
                "id": 357200929,
                "ltd": 20191220
            },
            {
                "symbol": " Inst1",
                "id": 357200932,
                "ltd": 20191220
            },
            {…}
        ],
        "Inst2": [
            {
                "symbol": "Inst2",
                "id": 357201388,
                "ltd": 20191220
            },
            {
                "symbol": "Inst2",
                "id": 371886725,
                "ltd": 20200320
            }
        ]
    }

Имя, а также количество узлов верхнего уровня (Inst1, Inst2) являются переменными и неизвестны. Я считаю, что правильное имя для таких узлов - «Ключи динамического кодирования», и поэтому enum не может использоваться.

Подузлы находятся в массиве и всегда имеют одинаковую структуру. Их число неизвестно и может быть различным для каждого верхнего узла (например, inst1 может иметь 10 подузлов, но Inst2 может иметь 5).

Я изо всех сил пытаюсь найти правильный способ декодировать / кодировать такой ответ,Любая помощь будет очень высоко ценится. Спасибо

После ответа Sh_Khan я попробовал приведенный ниже код, но он не работает.

var json = """
{
      "Inst1": [
          {
              "symbol": "Inst1",
              "id": 357200929,
              "ltd": 20191220
          },
          {
              "symbol": " Inst1",
              "id": 357200932,
              "ltd": 20191220
          }
      ],
      "Inst2": [
          {
              "symbol": "Inst2",
              "id": 357201388,
              "ltd": 20191220
          },
          {
              "symbol": "Inst2",
              "id": 371886725,
              "ltd": 20200320
          }
      ]
  }
""".data(using: .utf8)!

struct Inst: Codable {
  let symbol: String
  let id, ltd: Int
}

let result = try? JSONDecoder().decode([String:[Inst]].self,from: json)

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Решение, предоставленное Sh_Khan, работает.

let res = try? JSONDecoder().decode([String:[Inst]],from:data)


struct Inst: Codable {
  let symbol: String
  let id, ltd: Int
}

Спасибо за ваш вклад.

0 голосов
/ 27 октября 2019

Вам нужно

let res = try? JSONDecoder().decode([String:[Inst]],from:data)


struct Inst: Codable {
  let symbol: String
  let id, ltd: Int
}

Правильный JSON

    var json = """
    {
          "Inst1": [
              {
                  "symbol": "Inst1",
                  "id": 357200929,
                  "ltd": 20191220
              },
              {
                  "symbol": " Inst1",
                  "id": 357200932,
                  "ltd": 20191220
              }
          ],
          "Inst2": [
              {
                  "symbol": "Inst2",
                  "id": 357201388,
                  "ltd": 20191220
              },
              {
                  "symbol": "Inst2",
                  "id": 371886725,
                  "ltd": 20200320
              }
          ]
      }
    """.data(using: .utf8)!
...