извлечение данных JSON и их анализ (нужна помощь) - PullRequest
1 голос
/ 09 июня 2019

привет, я пытаюсь получить больше опыта в том, как получить код JSON с веб-сайта, а затем проанализировать его.(см. код ниже) это работает, но я понимаю, что от Apple это "старый, 2017" способ сделать это.И у меня есть некоторые проблемы со словарем,

Вопрос1.как я могу улучшить приведенный ниже код без использования каких-либо сторонних методов или программного обеспечения.

как мне избавиться от дополнительных операторов, и я просто хочу напечатать значение print (jsondata ["title"])

Я надеюсь, что вы можете направить меня в правильном направлении.

thx Рон

см. Код

'' '

//: Playground - noun: a place where people can play
// put in some requirements to yse the playground
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

import Foundation
import UIKit

//just a check if I get some output in a variable and to see if the playground is working
var str = "this is a test to see if there is output"

// retrieve the data from a website and put it into an object called jsondata; print the size of jsondata in bytes and put it into a variable called data; put number of elements in jsondata into jsonelements

let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")
URLSession.shared.dataTask(with:url!, completionHandler: {(datasize, response, error) in
    guard let data = datasize, error == nil else { return }

do {
    let jsondata = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:Any]

    //print the dictionary
    print(jsondata)

    // how many elements in the dictionary
    let jsonelements = jsondata.count
    print(jsonelements)

    // Iterate through the dictionary and print the value per key
    for (key,value) in jsondata {
        print("\(key) = \(value)")
    }

    // get the values out of the dictionry
    print(" ")
    print(jsondata["title"])
    print(jsondata["userID"])
    print(jsondata["id"])
    print(jsondata["completed"])

} catch let error as NSError {
    print(error)
}

}).resume()

' ''

    // get the values out of the dictionry
    print(" ")
    print(jsondata["title"])
    print(jsondata["userID"])
    print(jsondata["id"])
    print(jsondata["completed"])

здесь я получаюВыражение «предупреждение», неявно приведенное из «Любого?»на любой

, почему я получаю предупреждение? и как мне напечатать просто print (jsondata ["title"] без предупреждения. Я думаю, что делаю это правильно

Ответы [ 3 ]

0 голосов
/ 09 июня 2019

Стандартный способ сделать это - объявить тип и использовать его, как показано ниже,

// MARK: - Response
struct Response: Codable {
    let userID, id: Int
    let title: String
    let completed: Bool

    enum CodingKeys: String, CodingKey {
        case userID = "userId"
        case id, title, completed
    }
}

URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
    guard let data = data else { return }

    do {
        let response = try JSONDecoder().decode(Response.self, from: data)
        print(response.id)
        print(response.userID)
        print(response.title)
        print(response.completed)
    } catch {
        print(error)
    }

}).resume()
0 голосов
/ 09 июня 2019

Question1. как я могу улучшить приведенный ниже код без использования каких-либо сторонних методов или программного обеспечения.

Используйте Decodable, он декодирует данные непосредственно в структуру. Нет опций, нет Any.

//: Playground - noun: a place where people can play
// put in some requirements to yse the playground
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true

import Foundation
import UIKit

struct ToDo : Decodable {

    let userId, id : Int
    let title : String
    let completed : Bool
}

let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")!
URLSession.shared.dataTask(with:url) { data, _, error in
    guard let data = data else { print(error!); return }

    do {
        let todo = try JSONDecoder().decode(ToDo.self, from: data)

        // get the values out of the struct
        print(" ")
        print(todo.title)
        print(todo.userId)
        print(todo.id)
        print(todo.completed)

    } catch {
        print(error)
    }
}.resume()
0 голосов
/ 09 июня 2019

Чтобы исключить предупреждения и распечатать значения без дополнительного, сделайте это, если указано ниже.

if let title = jsondata["title"] {
   print(title)
}

Вы также можете сделать это, используя guard let

guard let title = jsondata["title"] else { return }
print(title)

Если вы на 100% возвращаете тип, и что он не будет равен нулю, используйте guard let или

print(jsondata["title"] as! String)

Однако приведенный выше пример не рекомендуется, поскольку вы обычно не хотите принудительно разворачивать (!)

Что касается предупреждения и другого примера -> https://stackoverflow.com/a/40691455/9578009

...