如何在Swift中解码动态嵌套JSON

时间:2019-10-27 09:59:30

标签: json swift decode

我一直在尝试从后端系统解码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)的名称和数量是可变的并且未知。我相信这些节点的正确名称是“动态编码键”,这就是为什么不能使用枚举的原因。

子节点位于数组中,并且始终共享相同的结构。它们的数量是未知的,并且对于每个顶级节点可能不同(例如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 :(得分:0)

您需要

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)!

答案 1 :(得分:-1)

Sh_Khan提供的解决方案有效。

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


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

感谢您的输入。