【问题标题】:GET data from a website using JSON format使用 JSON 格式从网站获取数据
【发布时间】:2018-12-14 11:36:57
【问题描述】:

我想从代码中提到的网站获取数据,但我遇到了一个错误,我不知道应该怎么做才能解决它。 有没有人可以帮助我? 谢谢

这是我使用的代码

 @IBAction func onGetTapped(_ sender: Any) {
   guard let url = URL(string: "http://gpsforanimal.herokuapp.com/") else { return }
 let session = URLSession.shared
 session.dataTask(with: url) { (data, response, error) in
                if let response = response {
                    print(response)
                }
                if let data = data {
                    print(data)
                    do {
                        let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any]
                        print(json)
                    } catch {
                        print(error)
                    }

                }
            }.resume()
        }

我明白了

<NSHTTPURLResponse: 0x16d47ac0> { URL: http://gpsforanimal.herokuapp.com/ } { status code: 200, headers {
    "Cache-Control" = "max-age=0, private, must-revalidate";
    Connection = "keep-alive";
    "Content-Length" = 17536;
    "Content-Type" = "text/html; charset=utf-8";
    Date = "Thu, 05 Jul 2018 21:57:30 GMT";
    Etag = "W/\"cde6bf7e5688b2395a936b5785c715c4\"";
    Server = "WEBrick/1.3.1 (Ruby/2.2.6/2016-11-15)";
    "Set-Cookie" = "_GPS_session=MkZTb1NWQmp1QnA5MXFpUHQ3Wk1NdHV6Vm5ESjNGR1M5cC9jMUkxRTFVQXFuU1VTWko0R2F2a29WV3hNMzczcTAzVjB2TmpBTG5QbGFwcUVObnFHTEp5T0J6NWlFNXNBZ1ZJT1M4R3ZxRWthTzV4RUswalk3eDlrME1mc09KRGZlYzhLaGwxSlh1aGVXcDlPaFF4Vi9RPT0tLUNzNHpzUlVHSXFkZ3czZThyZU9ZMlE9PQ%3D%3D--c9fbcde23b38905f956d4a139629c710565d1015; path=/; HttpOnly";
    Via = "1.1 vegur";
    "X-Content-Type-Options" = nosniff;
    "X-Frame-Options" = SAMEORIGIN;
    "X-Request-Id" = "c2c9432e-37dd-4f44-9d10-62314f2c8ebc";
    "X-Runtime" = "0.040508";
    "X-Xss-Protection" = "1; mode=block";
} }
17536 bytes
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0x16d63c60 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}

【问题讨论】:

标签: ios json swift


【解决方案1】:

试试这个:

func getURL(){
    var request = URLRequest(url: URL(string: "http://gpsforanimal.herokuapp.com/positions.json")!)
    request.httpMethod = "GET"
    let session = URLSession.shared
    session.dataTask(with: request) {data, response, error in
        if error != nil {
            print(error!.localizedDescription)
        }
        guard let data = data else { return }
        do {
            //Decode retrived data with JSONDecoder and assing type of Article object
            let realData = try JSONDecoder().decode([gps].self, from: data)
            print(realData)
        } catch let jsonError {
            print(jsonError)
        }
        }.resume()
}

并创建一个像这样编码的结构:

struct gps : Codable{
    var id = Int()
    var longitude  : String?
    var latitude : String?
    var created_at = String()
    var updated_at = String()
    var url = String()

    init(){
        self.id = Int()
        self.longitude = String()
        self.latitude  = String()
        self.created_at = String()
        self.updated_at = String()
        self.url = String()
    }
}

然后调用你的函数getURL()

【讨论】:

  • 谢谢,效果很好,能告诉我如何获取最后的数据(经纬度)
  • 好的,别忘了给答案打分。 realData 现在是您响应中的一个数组。你可以做任何你想做的事情,例如在这样的循环中迭代数组:for i in itemsData{ print(i.latitude) print(i.longitude) }
  • 为您的最后一项执行此操作:if let data =articlesData.last { print(data.latitude) print(data.longitude) }
  • 你知道我在经纬度之间如何使用 mapView 来查看位置吗?
【解决方案2】:

对于swift4.1不需要初始化

func getURL(){
    var request = URLRequest(url: URL(string: "http://gpsforanimal.herokuapp.com/positions.json")!)
    request.httpMethod = "GET"
    let session = URLSession.shared
    session.dataTask(with: request) {data, response, error in
        if error != nil {
            print(error!.localizedDescription)
        }
        guard let data = data else { return }
        do {
            //Decode retrived data with JSONDecoder and assing type of Article object
            let decoder = JSONDecoder()
            decoder.keyDecodingStrategy = .convertFromSnakeCase
            let realData = try decoder.decode([gps].self, from: data)
            print(realData)
        } catch let jsonError {
            print(jsonError)
        }
        }.resume()
}

创建一个结构:

struct gps : Decodable{
    var id :Int
    var longitude  : String?
    var latitude : String?
    var createdAt : String
    var updatedAt : String
    var url : String
 }

【讨论】:

    【解决方案3】:

    你能不能把网址改成http://gpsforanimal.herokuapp.com/positions.json再试一次;

    您提供的 URL 返回了 JSON 的表格渲染,您需要提取 JSON 而不是表格。

    【讨论】:

    • 感谢您的回复,效果很好。您知道如何获取网站上的最后一个数据(最后一个坐标)
    【解决方案4】:

    尝试使用AlamoFire 获取数据。您可以使用SwiftyJSON 来分析并更好地从网站的 JSON 响应中获取数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多