将AlamoFire/SwiftyJSON中的JSON转换为Swift/Xcode中的字典

将AlamoFire/SwiftyJSON中的JSON转换为Swift/Xcode中的字典,xcode,swift,alamofire,swifty-json,Xcode,Swift,Alamofire,Swifty Json,我的脑袋要爆炸了:)-我一直在尝试从我的服务器获取一个JSON字符串到一个字典值,但我无法让它工作 我正在尝试获取(从我的服务器-这是动态的,我希望我的应用程序能够在需要时从服务器获取新数据): 使用Swift在Xcode中创建此词典: var labels = [ 1 : "Location 1", 2 : "Location 2", 3 : "Location 3" ] 这必须是非常直截了当的,但就我的生活而言,我无法理解它

我的脑袋要爆炸了:)-我一直在尝试从我的服务器获取一个JSON字符串到一个字典值,但我无法让它工作

我正在尝试获取(从我的服务器-这是动态的,我希望我的应用程序能够在需要时从服务器获取新数据):

使用Swift在Xcode中创建此词典:

  var labels = [

        1 : "Location 1",
        2 : "Location 2",
        3 : "Location 3"

    ]
这必须是非常直截了当的,但就我的生活而言,我无法理解它

这是我的Swift——我可以用它从服务器上提取信息,但我不能像我需要的那样把它放到字典里

var postEndpoint: String = "http://www.myserver.net/app/campus.php"

    Alamofire.request(.GET, postEndpoint)
        .responseJSON { (request, response, data, error) in
            if let anError = error
            {
                println("error")
                println(error)
            }
            else if let data: AnyObject = data 
            {
                 let post = JSON(data)
                 println(post)
            }
    }
其结果是:

{
  "1" : "Location 1",
  "2" : "Location 2",
  "3" : "Location 3"
}
我使用它的最终结果是一个带有以下代码的iBeacon实现:

 let knownBeacons = beacons.filter{ $0.proximity != CLProximity.Unknown }
    if (knownBeacons.count > 0) {
        let closestBeacon = knownBeacons[0] as CLBeacon

        let locationID = post[closestBeacon.minor.integerValue]

        self.locationLabel.text = locationID
        self.view.backgroundColor = self.colors[closestBeacon.minor.integerValue]
    }
let responseString = "{\"1\":\"Location 1\",\"2\":\"Location 2\",\"3\":\"Location 3\"}"

if let dataFromString = responseString.data(using: String.Encoding.utf8, allowLossyConversion: false) {

    let json = JSON(data: dataFromString)

    var labels = json.dictionaryObject! as! [String: String]

    print(labels)
}

我得到的错误是self.locationLabel.text=locationID'JSON'不能转换为'String',当我使用静态var标签字典时,我没有得到这个错误。我是否试图错误地从服务器获取数据?我做错了什么???我认为var标签有一个未声明的类型,这使Swift能够了解它需要什么,我如何从JSON部分做同样的事情?

我通过反向工作解决了这个问题。我换了电话。我没有从服务器获取值字典,而是使用变量中已有的单个变量查询服务器

closestBeacon.minor.integerValue
然后从服务器获取我需要的字符串,这就解决了我的问题。仍然有相同数量的对服务器的调用,因此没有增加额外的开销。有时候你只需要跳出你自己的框框去思考

如果有人能从另一个方向解决这个问题,我仍然很想知道它是如何工作的。

哦,你离得太近了

let json = JSON(data)
var post = [Int: String]()

for (key, object) in json {
    post[key.toInt()!] = object.stringValue
}
您的问题是您的
post
词典是
[String:String]
而不是您认为的
[Int:String]
。您有几种方法可以修复它,但目前最简单的方法是执行以下操作:

let locationID = post[String(closestBeacon.minor.integerValue)]!
虽然这肯定会奏效,但更好的解决方案是将您的
post
转换为
[Int:String]
类型化词典,就像您在
responseJSON
闭包中所期望的那样。这是如何工作的

let json = JSON(data)
var post = [Int: String]()

for (key, object) in json {
    post[key.toInt()!] = object.stringValue
}

如果
对象
无法分别转换为
Int
字符串
时,您可能希望添加一些安全措施,但我将把这留给您。

如果拥有
[String:String]
对任何人都足够,他/她可以尝试以下代码:

 let knownBeacons = beacons.filter{ $0.proximity != CLProximity.Unknown }
    if (knownBeacons.count > 0) {
        let closestBeacon = knownBeacons[0] as CLBeacon

        let locationID = post[closestBeacon.minor.integerValue]

        self.locationLabel.text = locationID
        self.view.backgroundColor = self.colors[closestBeacon.minor.integerValue]
    }
let responseString = "{\"1\":\"Location 1\",\"2\":\"Location 2\",\"3\":\"Location 3\"}"

if let dataFromString = responseString.data(using: String.Encoding.utf8, allowLossyConversion: false) {

    let json = JSON(data: dataFromString)

    var labels = json.dictionaryObject! as! [String: String]

    print(labels)
}
结果是:
[“2”:“位置2”,“1”:“位置1”,“3”:“位置3”]

您还需要递归检查内部JSON 使用下面的函数转换为字典或数组

static func toDictionary(from: JSON) -> Any? {
    if from.type == .array {
        var array = [Any]()
        for _i in 0..<from.count {
            array.append(toDictionary(from: from[_i]) as Any)
        }
        return array
    } else if from.type == .dictionary {
        var dictionary = [String: Any]()
        for (key, value) in from {
            dictionary[key] = toDictionary(from: value)
        }
        return dictionary
    } else {
        return from.stringValue
    }
}
static funct-toDictionary(from:JSON)->有吗?{
如果from.type==.array{
变量数组=[Any]()

对于0中的_i..谢谢!我将如何映射它?抱歉,我对swift完全陌生。嗨@davidbii,我更新了我的答案,以展示如何将json对象转换为[Int:String]字典。如果我的json“更深”,是否有递归方法?结果是
[String:AnyObject]
意识到你有很多代码,但这是对OP问题的回答,还是仅仅是一个良好实践指南。请更新你的答案,以参考解决方案(然后包括良好实践),或转换为答案。