ウェブサイトから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/
ここで何が間違っていますか?
これらの2つの機能は私のために働いた:
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
}
このコードは私にとってはうまく機能します。 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;
}
);
}
更新: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()
元の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
}
以下の例は、株式情報を取得するためのリクエストを送信します-少し包括的ですが、よりクリーンアップと構造があります:
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(またはさらに良いことに不変の値オブジェクト)を返すか、失敗を示してください。
Swift 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()
@ 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()
}
//
// 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)
}
}