使用 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