【问题标题】:swift 3 json not workingswift 3 json 不工作
【发布时间】:2016-09-27 13:07:40
【问题描述】:

我正在处理 Swift 3 和 php 文件之间的数据库连接。 发送到php的信息会被正确的传输到数据库中。

但是当我想将数据库中的信息打印到我的 xcode 中时,我遇到了问题。

我正在将此 json 发送到我的应用程序:

[{"latitude":"51.430536341034","longitude":"5.45947450542819"},
{"latitude":"51.4305299243587","longitude":"5.45964865535365"},
{"latitude":"51.4305299243587","longitude":"5.45964865535365"},
{"latitude":"51.4305299243587","longitude":"5.45964865535365"},
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}]

我在 xcode 中打印了这个 JSON:

print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!)

我尝试了本网站其他主题中描述的 2 个选项,它们都是关于 swift 3 和 json 问题的。

选项 1:

let parsedData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]

当我运行应用程序时,出现了一个错误:

信号 SGBRT 无法将类型“__NSArrayI”(0x1b2a89cc8) 的值转换为“NSDictionary”(0x1b2a8a128)。

选项 2:

let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! Dictionary<String, AnyObject>

会发生相同的 Signal SGBRT 错误:

无法将“__NSArrayI”(0x1b2a89cc8) 类型的值转换为“NSDictionary”(0x1b2a8a128)。

我需要说我不是专业人士,但我是一个学习刻苦的学生,没有可以快速编程的人脉。因此,我希望在这里得到一些帮助,完成应用程序的这个功能。

如果你回答了这个话题,我很乐意在这里提供一些我应该尝试的其他代码。 谢谢。

【问题讨论】:

  • 嗯,数组不是字典……!!您应该将结果转换为字典数组:[[String:AnyObject]] 而不仅仅是字典。
  • 你不需要allowFragments。此外,Dictionary&lt;String, AnyObject&gt;[String:AnyObject] 相同。
  • @EricAya 很好,解决了那个特定的错误,但是一个新的错误立即出现。当我想获得它的纬度时: parsedData["latitude"] 它会说 Type '[[String:AnyObject]]?'没有下标成员..
  • 我们刚刚将您的 JSON 转换为 数组。当然你不能像字典一样下标。这是一个数组! 从数组中获取项目(字典)然后使用下标...
  • 你的 json 包含 dict 的数组 [ ] 不要尝试使用 dict ..

标签: php json swift


【解决方案1】:

从您添加的有问题的 JSON 响应中,如果这是您需要使用 [[String: String]] 而不是 [[String: AnyObject]] 的唯一响应,因为使用 AnyObject 您需要先将其转换为 String 然后加倍,所以如果你使用[[String: String]],它就是面糊。现在你有了字典数组,所以像这样获取所有坐标。

let parsedData = try? JSONSerialization.jsonObject(with: data!, options: []) as! [[String:String]]
for dic in parsedData {
    if let lat = Double(dic["latitude"]), let long = Double(dic["longitude"]) {
        print(lat)
        print(long)
    }
}

【讨论】:

  • 是的!您的解决方案有效,我非常感谢!任何人都可以评价他,我不能这样做......但真的感谢Nirav D!
  • 欢迎朋友 :)
【解决方案2】:

您的JSON 明确表示它是一个字典数组,因此您应该将其转换为字典数组[[String: AnyObject]]。 cmets中已经提到过。试试下面,它可能会帮助你:

//First you should check for data whether it has value
if let data = data {
    //This gives you an array of dictionaries as per your JSON data. So safer side try to 'guard let' it so that it should not crash if your JSON data is nil
    guard let parsedDataArray = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: AnyObject]] else { return }

    //Here you can enumerate through your array to get each dictionary
    for parsedDict in parsedDataArray {
        //This gives the value of latitude
        if let latitude = parsedDict["latitude"] {
            print(latitude)
        }
        //And this is for "longitude"
        if let longitude = parsedDict["longitude"] {
            print(longitude)
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多