【问题标题】:Swift 4 decoding nested JSON with random key [duplicate]Swift 4 使用随机键解码嵌套 JSON [重复]
【发布时间】:2018-07-02 20:35:57
【问题描述】:

我是 Swift 4 的新手,正在尝试从 Wikipedia API 解码此 JSON。我正在努力定义一个结构,因为我发现的所有示例/教程都只嵌套了 1-2 层。

除此之外,当其中一个键是随机的时,我如何解码数据?

谢谢

{
  "batchcomplete": "",
  "query": {
      "pages": {
          "RANDOM ID": {
              "pageid": 21721040,
              "ns": 0,
              "title": "Stack Overflow",
              "extract": "Stack Overflow is a privately held website, the flagship site of the Stack Exchange Network...."
         }
      }
   }
}

【问题讨论】:

  • 键RANDOM ID的值是一个字典,键是String,所以你可以创建一个表示值的结构并解码[String:MyStruct]
  • 是的,它是一个随机数。 @马特

标签: json swift decode swift4


【解决方案1】:

此解决方案有效:

//: Playground - noun: a place where people can play
import Foundation
var str = """
{
    "batchcomplete": "",
    "query": {
        "pages": {
            "RANDOM ID": {
                "pageid": 21721040,
                "ns": 0,
                "title": "Stack Overflow",
                "extract": "Stack Overflow is a privately held website, the flagship site of the Stack Exchange Network...."
            }
        }
    }
}
"""
struct Content: Decodable {
    let batchcomplete: String
    let query: Query
    struct Query: Decodable {
        let pages: Pages
        struct Pages: Decodable {
            var randomId: RandomID?
            struct RandomID: Decodable {
                let pageid: Int64
                let ns: Int64
                let title: String
                let extract: String
            }
            init(from decoder: Decoder) throws {
                let container = try decoder.container(keyedBy: CodingKeys.self)
                for key in container.allKeys {
                    randomId = try? container.decode(RandomID.self, forKey: key)
                }
                print(container.allKeys)
            }
            struct CodingKeys: CodingKey {
                var stringValue: String
                init?(stringValue: String) {
                    self.stringValue = stringValue
                }
                var intValue: Int?
                init?(intValue: Int) {
                    return nil
                }
            }
        }
    }
}
let data = str.data(using: .utf8)!
var content = try? JSONDecoder().decode(Content.self, from: data)
print(content)

【讨论】:

  • 为什么使用Int64 而不是Int?
  • @DávidPásztor 只是一个示例。不再。这段代码应该被优化。
  • 完美,谢谢! @维亚切斯拉夫
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多