Ios 尝试使用swift 4.2中的值在json结构中的位置来解码该值

Ios 尝试使用swift 4.2中的值在json结构中的位置来解码该值,ios,json,swift,api,Ios,Json,Swift,Api,如何使用swift Decodable解码以下内容?我只对提取值感兴趣 { "batchcomplete":"", "query":{ "normalized":[ ], "pages":{ "434325":{ //can be any number! "pageid":434325, "ns":0, "title":"asdfasdfsa",

如何使用swift Decodable解码以下内容?我只对提取值感兴趣

{  
   "batchcomplete":"",
   "query":{  
      "normalized":[  ],
      "pages":{  
         "434325":{    //can be any number!
            "pageid":434325,
            "ns":0,
            "title":"asdfasdfsa",
            "extract":""
我正在尝试以下操作:

struct Entry: Decodable {
    let batchcomplete: String
    let query: Query

    struct Query: Decodable {
        let normalized: [String]
        let pages: Page

        struct Page: Decodable {
            let pageid: Entry // I think this is going to be an issue

            struct Entry: Decodable {
                let title: String
                let extract: String 
            }

        }
    }
}
我正试图像这样检索摘录:

  print(entry.query.pages.first.extract) 
有没有办法先使用.first


我最多只能得到一页,所以理想情况下我只需要抓取第一个元素。

在“查询类型”之前,您的解码代码都是正常的

那么应该用什么来代替呢

struct Query: Decodable {
    let normalized: [String]
    let pages: [String: Page]

    struct Page: Decodable {
        let pageid: Int
        let title: String
        let extract: String
    }
}
因此,关键点是:

  • 如果您不知道会有哪些键,请使用
    [String://code>,因为任何
    JSON对象
    都可以映射到
    [String://code>
  • 您不需要声明
    页面。条目
    ,只需将所有字段放入
    页面
  • 要获取
    extract
    而不是
    entry.query.pages.first.extract
    您必须使用
    entry.query.pages.first?.value.extract
    extract
    第一个随机页面,因为
    [String:page]
    未排序)或
    entry.query.pages.sorted(按:排序器).first?.value.extract
    (其中,
    sorter
    是一个函数,它接受两个键值对,如果第一个键值对按顺序在第二个键值对之前,则返回true)使用某种顺序获取
    第一个

  • 使用泛型解码JSON如果您只需要一个值,SwiftyJSON可能更容易使用。这有助于复制