Извлечение комплекса Джсон в Свифт - PullRequest
0 голосов
/ 31 мая 2018

как мне извлечь этот тип JSON в Swift?Спасибо.

JSON

{  
   "item":{  
      "id":33,
      "title":"Article 5",
      "subtitle":"Tasing  123",
      "body":"Hello world " ,
      "date":"15/04/2013 11:48"
   }
}

Попытка

func getJsonList(completion: @escaping (Bool, Any?, Error?) -> Void) {

    DispatchQueue.global().async {

        guard let url = URL(string: "http://") else { return }

        do {
            let data = try Data(contentsOf: url)
            let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Array<Any>]


            var details = [Detail]()

            if let jsonDetails = json!["item"] as? [[String: Any]] {

                for item in jsonDetails {

                    let detail = Detail()

                    if let body = item["body"] as? String  {
                        detail.body = body
                    }

                    if let title = item["title"] as? String  {
                        detail.title = title
                    }

                    if let subTitle = item["subtitle"] as? String {
                        detail.subTitle = subTitle
                    }

                    if let date = item["date"] as? String {
                        detail.date = date
                    }

                    details.append(detail)
                }

            }

            DispatchQueue.main.async {
                completion(true, details, nil)

            }

        } catch {
            DispatchQueue.main.async {
                completion(false, nil, error)
                print("Error", error.localizedDescription.description)
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Это еще один пример Codable, за исключением того, что он преобразует date String в значение Date.Это одна из моих ненавистей к домашним животным, лично вы должны избегать сохранения значений даты / времени как String ... только не начинайте меня.

struct Item: Codable {
    let id: Int
    let title: String
    let subtitle: String
    let body: String
    let date: Date
}

struct ItemList: Codable {
    let item: Item
}

let formatter = DateFormatter()
// 15/04/2013 11:48
formatter.dateFormat = "dd/MM/yyyy HH:mm"
formatter.locale = Locale(identifier: "en_US_POSIX")
// May want to include the timezone, since it's unspecified
// yet another pet hate

let jsonString = """
{
        "item":{
                "id":33,
                "title":"Article 5",
                "subtitle":"Tasing  123",
                "body":"Hello world " ,
                "date":"15/04/2013 11:48"
        }
}
"""
let jsonData = Data(jsonString.utf8)

do {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .formatted(formatter)
    let items = try decoder.decode(ItemList.self, from: jsonData)
    items.item.id
    items.item.title
    items.item.subtitle
    items.item.body
    items.item.date
} catch let error {
    print(error)
}

Более подробную информацию вы можете найти на Полное руководство по синтаксическому анализу JSON с помощью Swift 4

0 голосов
/ 31 мая 2018

Вы можете создать Swift4 Codable

struct Items: Codable {
    let item: Item
}

struct Item: Codable {
    let id: Int
    let title, subtitle, body, date: String
}

И использовать его с

let items = try? JSONDecoder().decode(Items.self, from: jsonData)

Надеюсь, это полезно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...