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

时间:2019-02-01 08:05:30

标签: ios json swift api

如何使用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

我只会每个人最多获得一页,因此理想情况下,我只会抓住第一个元素。

1 个答案:

答案 0 :(得分:1)

您的解码代码可以正常使用,直到出现“查询类型”为止。

那应该用什么代替

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

    struct Page: Decodable {
        let pageid: Int
        let title: String
        let extract: String
    }
}

所以,关键点:

  1. 如果您不知道会有什么键,请使用[String: <SomeDecodableType>],因为任何JSON Object都可以映射到[String: <Decodable>]
  2. 您无需声明Page.Entry,只需将所有字段放入Page
  3. 要获取extract而不是entry.query.pages.first.extract,您将不得不使用entry.query.pages.first?.value.extract(第一页随机页面的extract,因为[String: Page]未排序)或{{ 1}}(其中entry.query.pages.sorted(by: sorter).first?.value.extract是某个函数,它接受两个键值对,如果第一个应该按顺序移到第二个之前,则返回true)以某种顺序获得sorter