Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active February 19, 2017 02:10
Show Gist options
  • Save KentarouKanno/e7e3b6aed7a07f7b5ae432807c495e88 to your computer and use it in GitHub Desktop.
Save KentarouKanno/e7e3b6aed7a07f7b5ae432807c495e88 to your computer and use it in GitHub Desktop.
JSON, XML Sample

XMLとJSONを解析するiPhoneアプリの作り方 Sample

サイトURL

Xcode: 7.3.1
Swift: 2.2

★ JSON

import UIKit

class ViewController: UIViewController {
    
    // UITextView
    @IBOutlet weak var textView: UITextView!

    @IBAction func pushDwonload(sender: AnyObject) {
        
        // アクセスURL
        let url = NSURL(string: "http://editors.ascii.jp/c-minamoto/swift/swift-5-data.json")!
        let request = NSURLRequest(URL: url)
        
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: NSOperationQueue.mainQueue())
        
        var msg:String = ""
        let task = session.dataTaskWithRequest(request) { data, response, error in
            
            // メインスレッドで実行される
            if let _ = response, data = data {
                
                do {
                    // JSONをNSDictionaryに変換
                    let jsonDic = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as! NSDictionary
                    
                    if let arrayData = jsonDic["data"] as? NSArray {
                        // 配列のデータを1つずつ辞書データを取り出す
                        for datN in 0..<arrayData.count {
                            if let data = arrayData[datN] as? NSDictionary {
                                // キー"name"の文字データを取り出して、msg変数に追加
                                if let nameDat = data["name"] as? String{
                                    msg += "名前=\(nameDat)\n"
                                }
                                // キー"price"の数値データを取り出して、msg変数に追加
                                if let price = data["price"] as? Int{
                                    msg += "価格=\(price)\n"
                                }
                            }
                        }
                    }
                    
                    self.textView.text = msg
                    
                } catch {
                    // JSONパースエラー
                    print("JSONパースエラー: \(error)")
                }
                
            } else {
                // 通信エラー
                print("通信エラー:",error)
            }
        }
        
        task.resume()
    }
}

JSON Data

{"data":
    [
        {"name":"ダージリン","price":600},
        {"name":"アールグレイ","price":550}
    ]
}

★ StringからJSONを作成 → 解析する

import Foundation

let jsonText = "{\"address_components\": [{\"long_name\": \"フィンランド\",\"short_name\": \"FI\",\"types\": [\"country\",\"political\"]}]}"

if let jsonData = jsonText.data(using: .utf8) {
    do {

        let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) as! NSDictionary
        let jsonArray = jsonDict["address_components"] as? NSArray
        let dict = jsonArray?[0] as? NSDictionary
        let country = dict?["short_name"] as? String

        country

    } catch {

    }
}

★ XML

import UIKit

class ViewController: UIViewController, NSXMLParserDelegate {
    
    // UITextView
    @IBOutlet weak var textView: UITextView!
    var msg = ""
    
    @IBAction func pushDwonload(sender: AnyObject) {
        
        // URL
        let url = NSURL(string: "http://editors.ascii.jp/c-minamoto/swift/swift-5-data.xml")!
        let request = NSURLRequest(URL: url)
        
        let config = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: config, delegate: nil, delegateQueue: NSOperationQueue.mainQueue())
        
        let task = session.dataTaskWithRequest(request) { data, response, error in
            
            // メインスレッドで実行される
            if let _ = response, data = data {
                
                // XMLの解析を開始
                let parser = NSXMLParser(data: data)
                parser.delegate = self
                parser.parse()
                
            } else {
                // 通信エラー
                print("通信エラー:",error)
            }
        }
        task.resume()
    }
    
    // 1階層目のタグを覚えておく変数を用意
    var XMLtag1: String! = ""
    
    // タグの最初が見つかったら呼ばれる関数
    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        // タグが「data」なら「dataタグ」に入ったことをXMLtag1に覚えておく
        if elementName == "data" {
            XMLtag1 = "data"
        }
        
        // タグが「tea」で、すでに「dataタグ」に入った状態なら、その中のデータを取り出す
        if elementName == "tea" && XMLtag1 == "data" {
            // 属性「name」の文字を取りだしてmsg変数に追加
            if let teaName = attributeDict["name"] {
                msg += "名前=\(teaName)\n"
            }
            // 属性「price」の文字を取りだしてmsg変数に追加
            if let teaPrice = attributeDict["price"] {
                msg += "価格=\(teaPrice)\n"
            }
        }
    }
    
    // end tag for a specific element
    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        // タグが「data」なら タグが閉じられたので、XMLtag1をリセットして、メッセージを表示
        if elementName == "data" {
            XMLtag1 = ""
            textView.text = msg
        }
    }
}

XML Data

<data>
    <tea name="ダージリン" price="600"/>
    <tea name="アールグレイ" price="550"/>
</data>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment