在 Swift 中从 Class 创建 JSON 对象
Create JSON Object from Class in Swift
我是 iOS 开发和 Swift 的新手(所以请多多包涵)。我有一个这样定义的 class 对象:
class LocationPoint {
var x: Double
var y: Double
var orientation: Double
init(x: Double, y: Double, orientation: Double) {
self.x = x
self.y = y
self.orientation = orientation
}
}
在我的委托中,我创建了一个 class 的实例并将其附加到一个数组(在委托外部声明):
var pt = LocationPoint(x: position.x, y: position.y, orientation: position.orientation)
self.LocationPoints.append(pt)
到目前为止一切顺利。我可以在我的 viewcontroller 中的 textview 对象中显示数组值,并且每次更新时肯定会添加值。
现在,我想做的是在数组计数达到限制(比如 100 个值)后将其打包为 JSON 对象并使用 HTTP 请求将其发送到网络服务器。我最初的想法是使用 SwiftyJSON and Alamofire 来帮助解决这个问题......但是如果我试图将问题分解成更小的部分,那么我需要:
- 从 LocationPoints 数组创建 JSON 对象
- 创建 HTTP 请求以将 JSON 数据包发送到网络服务器
现在,我正试图解决第 1 步,但似乎无法开始。我已经使用 CocoaPods 安装了 pods(SwiftyJSON 和 Alamofire),但我不知道如何在我的 viewcontroller.swift 文件中实际使用它们。谁能提供一些关于如何从自定义 class 结构创建 JSON 对象的指导?
你应该看看 [NSJSONSerialization]
class here.
class LocationPoint {
var x: Double
var y: Double
var orientation: Double
init(x: Double, y: Double, orientation: Double) {
self.x = x
self.y = y
self.orientation = orientation
}
}
func locationPointToDictionary(locationPoint: LocationPoint) -> [String: NSNumber] {
return [
"x": NSNumber(double: locationPoint.x),
"y": NSNumber(double: locationPoint.y),
"orientation": NSNumber(double: locationPoint.orientation)
]
}
var locationPoint = LocationPoint(x: 0.0, y: 0.0, orientation: 1.0)
var dictPoint = locationPointToDictionary(locationPoint)
if NSJSONSerialization.isValidJSONObject(dictPoint) {
print("dictPoint is valid JSON")
// Do your Alamofire requests
}
为了补充 Marius 的答案,我稍微修改了代码以将位置点集合转换为有效的 JSON 对象。上面的答案适用于单个点,但此函数可用于转换点数组。
func locationPointsToDictionary(locationPoints: [LocationPoint]) -> [Dictionary<String, AnyObject>] {
var dictPoints: [Dictionary<String, AnyObject>] = []
for point in locationPoints{
var dictPoint = [
"x": NSNumber(double: point.x),
"y": NSNumber(double: point.y),
"orientation": NSNumber(double: point.orientation),
"timestamp": NSString(string: point.timestamp)
]
dictPoints.append(dictPoint)
}
return dictPoints
}
然后,在代码中你可以这样使用它:
var pt = LocationPoint(x: position.x, y: position.y, orientation: position.orientation, timestamp: timeStamp)
self.LocationPoints.append(pt)
if LocationPoints.count == 100 {
var dictPoints = locationPointsToDictionary(self.LocationPoints)
if NSJSONSerialization.isValidJSONObject(dictPoints) {
println("dictPoint is valid JSON")
// Do your Alamofire requests
}
//clear array of Location Points and start over
LocationPoints = []
}
这应该只在记录了 100 个位置点后才打包 JSON 对象。希望这有帮助。
我是 iOS 开发和 Swift 的新手(所以请多多包涵)。我有一个这样定义的 class 对象:
class LocationPoint {
var x: Double
var y: Double
var orientation: Double
init(x: Double, y: Double, orientation: Double) {
self.x = x
self.y = y
self.orientation = orientation
}
}
在我的委托中,我创建了一个 class 的实例并将其附加到一个数组(在委托外部声明):
var pt = LocationPoint(x: position.x, y: position.y, orientation: position.orientation)
self.LocationPoints.append(pt)
到目前为止一切顺利。我可以在我的 viewcontroller 中的 textview 对象中显示数组值,并且每次更新时肯定会添加值。
现在,我想做的是在数组计数达到限制(比如 100 个值)后将其打包为 JSON 对象并使用 HTTP 请求将其发送到网络服务器。我最初的想法是使用 SwiftyJSON and Alamofire 来帮助解决这个问题......但是如果我试图将问题分解成更小的部分,那么我需要:
- 从 LocationPoints 数组创建 JSON 对象
- 创建 HTTP 请求以将 JSON 数据包发送到网络服务器
现在,我正试图解决第 1 步,但似乎无法开始。我已经使用 CocoaPods 安装了 pods(SwiftyJSON 和 Alamofire),但我不知道如何在我的 viewcontroller.swift 文件中实际使用它们。谁能提供一些关于如何从自定义 class 结构创建 JSON 对象的指导?
你应该看看 [NSJSONSerialization]
class here.
class LocationPoint {
var x: Double
var y: Double
var orientation: Double
init(x: Double, y: Double, orientation: Double) {
self.x = x
self.y = y
self.orientation = orientation
}
}
func locationPointToDictionary(locationPoint: LocationPoint) -> [String: NSNumber] {
return [
"x": NSNumber(double: locationPoint.x),
"y": NSNumber(double: locationPoint.y),
"orientation": NSNumber(double: locationPoint.orientation)
]
}
var locationPoint = LocationPoint(x: 0.0, y: 0.0, orientation: 1.0)
var dictPoint = locationPointToDictionary(locationPoint)
if NSJSONSerialization.isValidJSONObject(dictPoint) {
print("dictPoint is valid JSON")
// Do your Alamofire requests
}
为了补充 Marius 的答案,我稍微修改了代码以将位置点集合转换为有效的 JSON 对象。上面的答案适用于单个点,但此函数可用于转换点数组。
func locationPointsToDictionary(locationPoints: [LocationPoint]) -> [Dictionary<String, AnyObject>] {
var dictPoints: [Dictionary<String, AnyObject>] = []
for point in locationPoints{
var dictPoint = [
"x": NSNumber(double: point.x),
"y": NSNumber(double: point.y),
"orientation": NSNumber(double: point.orientation),
"timestamp": NSString(string: point.timestamp)
]
dictPoints.append(dictPoint)
}
return dictPoints
}
然后,在代码中你可以这样使用它:
var pt = LocationPoint(x: position.x, y: position.y, orientation: position.orientation, timestamp: timeStamp)
self.LocationPoints.append(pt)
if LocationPoints.count == 100 {
var dictPoints = locationPointsToDictionary(self.LocationPoints)
if NSJSONSerialization.isValidJSONObject(dictPoints) {
println("dictPoint is valid JSON")
// Do your Alamofire requests
}
//clear array of Location Points and start over
LocationPoints = []
}
这应该只在记录了 100 个位置点后才打包 JSON 对象。希望这有帮助。