使用 SwiftyJSON 处理 JSON 的示例

Posted

技术标签:

【中文标题】使用 SwiftyJSON 处理 JSON 的示例【英文标题】:Example handling JSON with SwiftyJSON 【发布时间】:2014-11-05 10:11:52 【问题描述】:

我想用 SwiftJSON 处理 json,但我堆叠了。 有人给我看示例代码吗?

我尝试使用这个库。 https://github.com/SwiftyJSON/SwiftyJSON

虽然我将 SwiftyJSON.swift 放在同一个项目中,但出现错误“没有这样的模块“SwiftyJSON”” 因此,请更正我的代码或向我展示使用 swiftyJSON 库从 Web 处理 json 的示例代码。

这是我的代码:

import UIKit
import SwiftyJSON // No such module "SwiftyJSON"

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let url = NSURL(string: "http://express.heartrails.com/api/json?method=getPrefectures")

        var request = NSURLRequest(URL: url!)
        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)

        var json = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as NSDictionary

        var hoge = JSON(data)
    

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

这是我的 Xcode 截图

【问题讨论】:

可能是您没有打开正确的文件。确保您打开的是 xcworkspace 文件,而不是 xcodeproj 文件。 【参考方案1】:

如果您在项目中添加了SwiftyJSON.swift,则不需要import。它已经可用。

试试:

import UIKit

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        let url = NSURL(string: "http://express.heartrails.com/api/json?method=getPrefectures")
        var request = NSURLRequest(URL: url!)
        var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: nil)
        if data != nil 
            var hoge = JSON(data: data!)
            println(hoge)
        
    

【讨论】:

谢谢!它运作良好!但我有一个问题。虽然方法中的第一个参数不需要参数名称,但为什么我们在函数JSON中需要“data:”。如果我不使用参数名称,我会在下面遇到麻烦。 if data != nil var hoge = JSON(data!) // 不能用 '@lvalue NSData' 类型的参数引入 'init' println(hoge) JSON(obj) 是将 Swift 对象(例如Dictionary)转换为JSON 对象。 JSON(data:dat) 是将NSData 转换为JSON 对象 我明白了!感谢您对声明 JSON 函数定义的 SwiftJson 源代码的链接的回答。 好的,我做到了....但现在我收到大量错误,告诉我将“as”替换为“as!”人在这个地方。为什么?【参考方案2】:

使用此https://github.com/SwiftyJSON/SwiftyJSON 版本获取最新的 SwiftyJSON

如果你想使用import SwiftyJSON 那么你需要添加 using pod 为此,请按照以下步骤操作

    打开终端运行sudo gem install cocoapods安装cocoapods 从您的终端转到您的项目主页 运行pod init初始化Podfile 打开Podfile并粘贴以下命令

platform :ios, '8.0' use_frameworks! target 'MyApp' do pod 'SwiftyJSON', '~> 2.2.1' end

    最后运行pod install,它会将SwiftyJSON添加到你的项目中 关闭 xcode 并打开 .xcworkspace 而不是 .xcodeproj

现在你可以走了

欲了解更多信息,SwiftyJSON in cocoapods

【讨论】:

然后构建项目。 "6. 关闭 xcode 并打开 .xcworkspace 而不是 .xcodeproj" 对我来说已经足够了。【参考方案3】:

我遇到的问题是没有关注this bit of the CocoaPods instructions:

确保始终打开 Xcode 工作区而不是项目 构建项目时的文件

我打开的是项目而不是工作区,导致没有这样的模块错误。

打开工作区后这个问题消失了。

【讨论】:

【参考方案4】:

您好,这是一个新教程的链接,该教程很好地解释了如何在 Swift 中使用 JSON。

Parsing JSON the SwiftyJSON Way

【讨论】:

谢谢!这是一个非常有用的页面! 那个例子只完成了一半,它只显示解析数据而不是写入。 这里不是在讨论 SwiftyJSON 库,而是在讨论一个不同的 Swifty JSON 库。【参考方案5】:

Api.swift

import UIKit

extension NSMutableData

    func appendString(string: String)
    
         let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    appendData(data!)
    


class Api: NSObject, NSXMLParserDelegate


func CallGetApi(str: String  ) -> JSON

    let url = NSURL(string: "http://"+str)
    let request = NSURLRequest(URL: url!)
    let data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)

    if data != nil
    
        let dataDict = JSON(data: data!)
        return dataDict
    
    return JSON(integerLiteral:5)


func isConnectedToNetwork() -> Bool

    var Status:Bool = false
    let url = NSURL(string: "http://google.com/")
    let request = NSURLRequest(URL: url!)
    let data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)

    if data != nil
    
        Status = true
    
    return Status


func CallPostApi(urlStr: String , postStr: String  ) -> JSON

    print(postStr)

    let link = "http://"+urlStr
    print("\(link)/?\(postStr)")
    let url = NSURL(string: link);
    let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    let request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 10.0)

    request.HTTPMethod = "POST";
    request.HTTPBody = postStr.dataUsingEncoding(NSUTF8StringEncoding);


    if let data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
    
        let dataDict = JSON(data: data)
        print(dataDict)
        return dataDict
    

    if self.isConnectedToNetwork() == false
    
        return JSON(integerLiteral:6)
    
    return JSON(integerLiteral:5)


func CallUpdatePictures(urlStr: String , parameters: [String: String]?, pics: Array<UIImage>  ) -> JSON

    let link = "http://"+urlStr
    let url = NSURL(string: link);
    let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    let request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 50.0)

    print(link)

    request.HTTPMethod = "POST"

    let boundary:String = "---------------------------14737809831466499882746641449"
    request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")


    let body:NSMutableData = NSMutableData()

    if parameters != nil
    
        for (key, value) in parameters!
        
            body.appendString("--\(boundary)\r\n")
            body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.appendString("\(value)\r\n")
        
    

    var i:Int = 1
    for pic in pics
    
        let img:UIImage = self.resizeImage(pic, maxHeight: 216, maxWidth: 384)
        let imageData = UIImagePNGRepresentation(img)
        //let imageData = UIImageJPEGRepresentation(img, 1.0)


        if imageData != nil
        
            body.appendString("--\(boundary)\r\n")
            body.appendString("Content-Disposition: form-data; name=\"image\(i)\"; filename=\"image.png\"\r\n")
            body.appendString("Content-Type: image/png\r\n\r\n")
            body.appendData(imageData!)
            body.appendString("\r\n")
            i=i+1
        
    

    body.appendString("--\(boundary)--\r\n")
    request.setValue("\(body.length)", forHTTPHeaderField:"Content-Length")
    request.HTTPBody = body

    if let data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
    
        let dataDict = JSON(data: data)
        print(dataDict)
        return dataDict
    

    if self.isConnectedToNetwork() == false
    
        return JSON(integerLiteral:6)
    
    return JSON(integerLiteral:5)


func CallUpdatePicture(urlStr: String , parameters: [String: String]?, pic: UIImageView  ) -> JSON

    let link = "http://"+urlStr
    let url = NSURL(string: link);
    let cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData
    let request = NSMutableURLRequest(URL: url!, cachePolicy: cachePolicy, timeoutInterval: 50.0)

    request.HTTPMethod = "POST"

    let boundary:String = "---------------------------14737809831466499882746641449"
    request.addValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")


    let body:NSMutableData = NSMutableData()

    if parameters != nil
    
        for (key, value) in parameters!
        
            body.appendString("--\(boundary)\r\n")
            body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.appendString("\(value)\r\n")
        
    

    if pic.image != nil
    
        let img:UIImage = self.resizeImage(pic.image!, maxHeight: 200, maxWidth: 200)
        let imageData = UIImagePNGRepresentation(img)

        if imageData != nil
        
            body.appendString("--\(boundary)\r\n")
            body.appendString("Content-Disposition: form-data; name=\"image\"; filename=\"image.png\"\r\n")
            body.appendString("Content-Type: image/png\r\n\r\n")
            body.appendData(imageData!)
            body.appendString("\r\n")
        
    

    body.appendString("--\(boundary)--\r\n")
    request.setValue("\(body.length)", forHTTPHeaderField:"Content-Length")
    request.HTTPBody = body

    if let data = try? NSURLConnection.sendSynchronousRequest(request, returningResponse: nil)
    
        let dataDict = JSON(data: data)
        print(dataDict)
        return dataDict
    

    if self.isConnectedToNetwork() == false
    
        return JSON(integerLiteral:6)
    
    return JSON(integerLiteral:5)


func resizeImage(image:UIImage, maxHeight:Float, maxWidth:Float) -> UIImage

    var actualHeight:Float = Float(image.size.height)
    var actualWidth:Float = Float(image.size.width)

    var imgRatio:Float = actualWidth/actualHeight
    let maxRatio:Float = maxWidth/maxHeight

    if (actualHeight > maxHeight) || (actualWidth > maxWidth)
    
        if(imgRatio < maxRatio)
        
            imgRatio = maxHeight / actualHeight;
            actualWidth = imgRatio * actualWidth;
            actualHeight = maxHeight;
        
        else if(imgRatio > maxRatio)
        
            imgRatio = maxWidth / actualWidth;
            actualHeight = imgRatio * actualHeight;
            actualWidth = maxWidth;
        
        else
        
            actualHeight = maxHeight;
            actualWidth = maxWidth;
        
    

    let rect:CGRect = CGRectMake(0.0, 0.0, CGFloat(actualWidth) , CGFloat(actualHeight) )
    UIGraphicsBeginImageContext(rect.size)
    image.drawInRect(rect)

    let img:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    let imageData:NSData = UIImageJPEGRepresentation(img, 1.0)!
    UIGraphicsEndImageContext()

    return UIImage(data: imageData)!


Api 类对象:

var ApiObj = Api()

登录API调用:

        let postString = "uid=\(Email_Txt.text!)&pwd=\(Password_Txt.text!)"
        var dataDict=ApiObj.CallPostApi("user/login", postStr: postString)

        if (dataDict.null == nil)
        
            if dataDict == 6
            
                 msg = "Network not available"
            
            else if dataDict.object.objectForKey("token") != nil
            
                 msg = "Successfull login "
            
            else if dataDict.object.objectForKey("err") != nil
            
                msg = "Invalid email or password"
            
        

【讨论】:

以上是关于使用 SwiftyJSON 处理 JSON 的示例的主要内容,如果未能解决你的问题,请参考以下文章

使用 SwiftyJSON 处理 JSON 响应

使用 SwiftyJSON 解析具有相似元素的 JSON

如何使用 SwiftyJSON 框架读取本地声明的 JSON

使用 Alamofire 和 SwiftyJSON 时对 JSON 进行排序

使用 SwiftyJSON 选择字符串数组

使用 SwiftyJSON 解析 JSON