Подтвердить что ты не робот

Загрузка и анализ json в быстрой

Я пытаюсь получить JSON с веб-сайта и разобрать его, прежде чем помещать его в iOS-представление.

Здесь мой код;

func startConnection(){
        let urlPath: String = "http://binaenaleyh.net/dusor/"
        var url: NSURL = NSURL(string: urlPath)
        var request: NSURLRequest = NSURLRequest(URL: url)
        var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
        connection.start()
    }

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
        self.data.appendData(data)
    }

    func buttonAction(sender: UIButton!){
        startConnection()
    }

    func connectionDidFinishLoading(connection: NSURLConnection!) {
        var err: NSError
        // throwing an error on the line below (can't figure out where the error message is)
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
    }

И это ссылка для JSON;

http://binaenaleyh.net/dusor/

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

Эти две функции работали для меня:

    func getJSON(urlToRequest: String) -> NSData{
        return NSData(contentsOfURL: NSURL(string: urlToRequest))
    }

    func parseJSON(inputData: NSData) -> NSDictionary{
        var error: NSError?
        var boardsDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary

        return boardsDictionary
    }

Ответ 2

Этот код отлично подходит для меня. Просто запустите свойство данных с data = NSMutableData() и напишите NSURLConnectionDelegate здесь class ViewController: UIViewController, NSURLConnectionDelegate

import UIKit

class ViewController: UIViewController, NSURLConnectionDelegate {

    @lazy var data = NSMutableData()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        startConnection()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func startConnection(){
        let urlPath: String = "http://binaenaleyh.net/dusor/"
        var url: NSURL = NSURL(string: urlPath)
        var request: NSURLRequest = NSURLRequest(URL: url)
        var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
        connection.start()
    }

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
        self.data.appendData(data)
    }

    func buttonAction(sender: UIButton!){
        startConnection()
    }

    func connectionDidFinishLoading(connection: NSURLConnection!) {
        var err: NSError
        // throwing an error on the line below (can't figure out where the error message is)
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
        println(jsonResult)
    }
}

здесь выводится:

{
    "ders sayisi" = 15;
    dersler =     (
                {
            0 = "2013-2014";
            1 = BAHAR;
            10 = TeacherHold;
            11 = 2;
            12 = "";
            2 = 2;
            3 = "CEE 102";
            4 = "Logic Circuits";
            5 = 3;
            6 = "6.00";
            7 = "YRD.DO\U00c7.DR.INDRIT MYDERRIZI";
            8 = 0;
            9 = IA;
        },
                {
            0 = "2013-2014";
            1 = BAHAR;
            10 = TeacherHold;
            11 = 1;
            12 = "";
            2 = 2;
            3 = "CIP 102";
            4 = "Civic Involment Projects";
            5 = 0;
            6 = "2.00";
            7 = "SE\U00c7\U0130L AVCI/BA\U015eAK CANSU AK\U00c7EL\U0130K/\U00c7A\U011eLA UNGUN";
            8 = 0;
            9 = P;
        },
                {
            0 = "2013-2014";
            1 = BAHAR;
            10 = TeacherHold;
            11 = 2;
            12 = "";
            2 = 2;
            3 = "COME 108";
            4 = "Algorithms and Programming II";
            5 = 3;
            6 = "6.00";
            7 = "\U00d6\U011eR.G\U00d6R.DR.B\U0130RSEN G\U00dcLDEN \U00d6ZDEM\U0130R";
            8 = 41;
            9 = C;
        },
                {
            0 = "2013-2014";
            1 = BAHAR;
            10 = TeacherHold;
            11 = 1;
            12 = "";
            2 = 2;
            3 = "COME 335";
            4 = "Mobile Application Development";
            5 = 3;
            6 = "5.00";
            7 = "\U00d6\U011eR.G\U00d6R.OZAN UYSAL";
            8 = TeacherHold;
            9 = TeacherHold;
        },
                {
            0 = "2013-2014";
            1 = BAHAR;
            10 = TeacherHold;
            11 = 1;
            12 = "";
            2 = 2;
            3 = "ENG 112";
            4 = "Advanced English For Engineering and Natural Sciences I";
            5 = 2;
            6 = "3.00";
            7 = "OKT.ERIC BEECHER";
            8 = 48;
            9 = F;
        },
                {
            0 = "2013-2014";
            1 = BAHAR;
            10 = TeacherHold;
            11 = 1;
            12 = "";
            2 = 2;
            3 = "PHYS 102";
            4 = "Physics II";
            5 = 4;
            6 = "5.00";
            7 = "YRD.DO\U00c7.DR.\U00d6ZG\U00dcL KURTULU\U015e \U00d6ZT\U00dcRK";
            8 = "-1";
            9 = F;
        },
                {
            0 = "2013-2014";
            1 = BAHAR;
            10 = TeacherHold;
            11 = 2;
            12 = "";
            2 = 2;
            3 = "T\U00dcRK 102";
            4 = "T\U00fcrk Dili II";
            5 = 2;
            6 = "2.00";
            7 = "\U00d6\U011eR.G\U00d6R.\U015eER\U0130FE GEZG\U0130N";
            8 = 10;
            9 = F;
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 2;
            12 = "";
            2 = 1;
            3 = "CHEM 101";
            4 = Chemistry;
            5 = 3;
            6 = "5.00";
            7 = "YRD.DO\U00c7.DR.AY\U015eEN TULPAR";
            8 = TeacherHold;
            9 = F;
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 1;
            12 = "";
            2 = 1;
            3 = "CIP 101";
            4 = "Civic Involment Projects";
            5 = 0;
            6 = "1.00";
            7 = "YRD.DO\U00c7.DR.FATMA G\U00dcL AYGEN/Staff CIP1/SE\U00c7\U0130L AVCI/D\U0130LAYDA EM\U0130R/BA\U015eAK CANSU AK\U00c7EL\U0130K/\U00c7A\U011eLA UNGUN";
            8 = TeacherHold;
            9 = P;
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 3;
            12 = "";
            2 = 1;
            3 = "COME 107";
            4 = "Algorithms and Programming I";
            5 = 4;
            6 = "5.00";
            7 = "PROF.DR.M\U0130TAT UYSAL";
            8 = TeacherHold;
            9 = "C+";
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 2;
            12 = "";
            2 = 1;
            3 = "ENG 101";
            4 = "Advanced English";
            5 = 2;
            6 = "3.00";
            7 = "OKT.EZG\U0130 ARGUN";
            8 = TeacherHold;
            9 = B;
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 1;
            12 = "";
            2 = 1;
            3 = "IUL 100";
            4 = "Introduction to University Life";
            5 = 0;
            6 = "1.00";
            7 = "YRD.DO\U00c7.DR.FATMA G\U00dcL AYGEN";
            8 = TeacherHold;
            9 = F;
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 2;
            12 = "";
            2 = 1;
            3 = "MATH 111";
            4 = "Calculus I";
            5 = 4;
            6 = "5.00";
            7 = "DO\U00c7.DR.G\U00dcRSEL YE\U015e\U0130LOT";
            8 = TeacherHold;
            9 = F;
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 4;
            12 = "";
            2 = 1;
            3 = "PHYS 101";
            4 = "Physics I [CNE]";
            5 = 4;
            6 = "5.00";
            7 = "YRD.DO\U00c7.DR.AR\U0130F \U00d6ZBAY";
            8 = TeacherHold;
            9 = F;
        },
                {
            0 = "2013-2014";
            1 = "G\U00dcZ";
            10 = TeacherHold;
            11 = 9;
            12 = "";
            2 = 1;
            3 = "T\U00dcRK 101";
            4 = "T\U00fcrk Dili I [CNE]";
            5 = 2;
            6 = "2.00";
            7 = "\U00d6\U011eR.G\U00d6R.ARZU AYG\U00dcN";
            8 = TeacherHold;
            9 = F;
        }
    );
}

Ответ 3

ОБНОВЛЕНИЕ: Swift 4

// Asynchronous Http call to your api url, using URLSession:
URLSession.shared.dataTask(with: URL(string: "http://api.site.com/json")!) { (data, response, error) -> Void in
    // Check if data was received successfully
    if error == nil && data != nil {
        do {
            // Convert to dictionary where keys are of type String, and values are of any type
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: Any]
            // Access specific key with value of type String
            let str = json["key"] as! String
        } catch {
            // Something went wrong
        }
    }
}.resume()

Вот как это сделать с помощью Swift 2 и NSURLSession:

// Asynchronous Http call to your api url, using NSURLSession:
NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: "http://api.site.com/json")!, completionHandler: { (data, response, error) -> Void in
    // Check if data was received successfully
    if error == nil && data != nil {
        do {
            // Convert NSData to Dictionary where keys are of type String, and values are of any type
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! [String:AnyObject]
            // Access specific key with value of type String
            let str = json["key"] as! String
        } catch {
            // Something went wrong
        }
    }
}).resume()

Ответ 4

Если исходный JSON является массивом, попробуйте это.

func parseJSON(inputData: NSData) -> Array<NSDictionary>{
    var error: NSError?
    var boardsDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as Array<NSDictionary>

    return boardsDictionary
}

Ответ 5

Приведенный ниже пример отправляет запрос на получение информации о запасе - он немного более всеобъемлющий, но имеет большую очистку и структуру:

import Foundation

private let kSNStockInfoFetchRequestPath:String = "http://dev.markitondemand.com/Api/v2/Quote/json"

private func SNStockInfoFetchRequestURL(symbol:String) -> NSURL? {
  if let components:NSURLComponents = NSURLComponents(string:kSNStockInfoFetchRequestPath) {
    components.queryItems = [NSURLQueryItem(name:"symbol", value:symbol)]
    return components.URL
  }
  return nil
}

private func SNStockInfoFetchRequestURLRequest(symbol:String) ->  NSURLRequest? {
  if let requestURL:NSURL = SNStockInfoFetchRequestURL(symbol) {
    var request:NSMutableURLRequest = NSMutableURLRequest(URL:requestURL)
    request.HTTPMethod = "GET"
    return request
  }
  return nil
}

private func SNStockInfoFetchRequestParseData(receivedData:NSData, error:NSErrorPointer) -> NSDictionary? {
  return NSJSONSerialization.JSONObjectWithData(receivedData, options:NSJSONReadingOptions.MutableContainers, error:error) as? NSDictionary
}

class SNStockInfoFetchRequest: NSObject,
NSURLConnectionDataDelegate
{
  private let symbol:String
  private (set) var fetching:Bool
  private lazy var receivedData = NSMutableData()

  init(symbol:String) {
    self.symbol = symbol
    self.fetching = false
  }

  func start() {
    assert(!fetching, "Should not start a request that has already started!")
    fetching = true
    if let request:NSURLRequest = SNStockInfoFetchRequestURLRequest(symbol) {
      var connection:NSURLConnection = NSURLConnection(request:request, delegate:self, startImmediately:true)!
      connection.start()
    }
  }

  // MARK: NSURLConnectionDataDelegate

  func connection(connection:NSURLConnection, didReceiveData data:NSData) {
    assert(fetching, "Should only receive data while activly fetching!")
    self.receivedData.appendData(data)
  }

  func connectionDidFinishLoading(connection:NSURLConnection) {
    var error:NSError?
    if let result:NSDictionary = SNStockInfoFetchRequestParseData(receivedData, &error) {
      println(result)
    } else {
      println(error)
    }

  }
}

Теперь мы можем использовать запрос как таковой:

let fetcher:SNStockInfoFetchRequest = SNStockInfoFetchRequest(symbol:"MSFT")
fetcher.start()

Это должно вывести JSON в случае успеха или ошибку в случае сбоя. Надеюсь это поможет! Если вы используете ту же структуру, убедитесь, что вы используете делегат, чтобы либо вернуть обработанный JSON (или даже лучше, объект неизменяемого значения), либо указать сбой.

Ответ 6

Ответ @david72 отлично работал у меня. Итак, здесь для Swift 3 и URLSession для вашего удобства. Кроме того, с дополнительной печатью ошибок для более легкой отладки.

func getHttpData(urlAddress : String)
{
    // Asynchronous Http call to your api url, using NSURLSession:
    guard let url = URL(string: urlAddress) else
    {
        print("Url conversion issue.")
        return
    }
    URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) -> Void in
        // Check if data was received successfully
        if error == nil && data != nil {
            do {
                // Convert NSData to Dictionary where keys are of type String, and values are of any type
                let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String:AnyObject]
                print(json)
                // Access specific key with value of type String
                // let str = json["key"] as! String
            } catch {
                print(error)
                // Something went wrong
            }
        }
        else if error != nil
        {
            print(error)
        }
    }).resume()
}

Ответ 7

Вот быстрый код 3.1

URLSession.shared.dataTask(with: NSURL(string: "http://pastebin.com/raw/wgkJgazE")! as URL, completionHandler: { (data, response, error) -> Void in
        // Check if data was received successfully
        if error == nil && data != nil {
            do {
                // Convert NSData to Dictionary where keys are of type String, and values are of any type
                let json = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [String:AnyObject]
                // Access specific key with value of type String
                let str = json["key"] as! String
            } catch {
                // Something went wrong
            }
        }
    }).resume()

Ответ 8

//
//  ViewController.swift
//  Test2
//
//  Created by fingent on 11/08/15.
//  Copyright (c) 2015 fingent. All rights reserved.
//

import UIKit

class ViewController: UIViewController,NSURLConnectionDelegate

{
lazy var data = NSMutableData()

    @IBAction func t1(sender: AnyObject) {
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        startConnection()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func startConnection(){
        let urlPath: String = "https://api.github.com/users/mralexgray"
        var url: NSURL = NSURL(string: urlPath)!
        var request: NSURLRequest = NSURLRequest(URL: url)
        var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)!
        connection.start()
    }

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!){
        self.data.appendData(data)
    }

    func buttonAction(sender: UIButton!){
        startConnection()
    }

    func connectionDidFinishLoading(connection: NSURLConnection!) {
        var err: NSError
        // throwing an error on the line below (can't figure out where the error message is)
        var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
        println(jsonResult)
    }


}