пытаясь декодировать значение в Swift 4.2, используя его положение в структуре JSON - PullRequest
0 голосов
/ 01 февраля 2019

Как я могу декодировать следующее, используя swift Decodable?Меня интересует только значение extract

{  
   "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 голосов
/ 01 февраля 2019

Ваш код декодирования в порядке до `Тип запроса.

Итак, что следует использовать вместо:

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] не отсортировано) или entry.query.pages.sorted(by: sorter).first?.value.extract (где sorter - некоторая функция, которая принимает две пары ключ-значение и возвращает true, если первая должна идти перед второй по порядку), чтобы получить first с использованием некоторого порядка.
...