从Swift 3和Xcode 8中的嵌套字典中获取值时出现问题
我用以下方法解析JSON:从Swift 3和Xcode 8中的嵌套字典中获取值时出现问题,swift,xcode,swift3,xcode8,Swift,Xcode,Swift3,Xcode8,我用以下方法解析JSON: let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) 并得到以下嵌套字典作为结果 { response = { GeoObjectCollection = { featureMember = ( { GeoObject = { Point = { pos = "40.275713
let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers)
并得到以下嵌套字典作为结果
{ response = { GeoObjectCollection = { featureMember =
(
{ GeoObject = { Point = { pos = "40.275713 59.943413"; }; }; },
{ GeoObject = { Point = { pos = "40.273162 59.944292"; }; }; }
);
};
};
}
我正试图从这个字典中获取坐标值,并将它们保存到新的latutudeString和longitudeString变量中
在Xcode 8 GM之前,我一直使用以下代码:
if let jsonCoordinatesString: String = dictionary["response"]!!["GeoObjectCollection"]!!["featureMember"]!![0]["GeoObject"]!!["Point"]!!["pos"]!! as? String {
var latLongArray = jsonCoordinatesString.components(separatedBy: " ")
let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]
}
但由于我安装了Xcode 8 GM,我收到一个错误:
类型Any没有下标成员
如何用Xcode 8修复Swift 3?我已经读到我可以用最新的Xcode在swift 3中嵌入字典,但我不知道如何使它工作。我读过,但它对我的情况确实没有帮助。问题是您没有指定
字典
对象的类型,您需要像这样明确地将字典
对象的类型指定为字典
let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as! [String: Any]
if let response = dictionary["response"] as? [String: Any],
let geoObjectCollection = response["GeoObjectCollection"] as? [String: Any],
let featureMember = geoObjectCollection["featureMember"] as? [[String: Any]] {
if let geoObject = featureMember[0]["GeoObject"] as? [String: Any],
let point = geoObject["Point"] as? [String: String] {
let latLongArray = point["pos"].components(separatedBy: " ")
let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]
}
}
问题是您没有指定
dictionary
对象的类型,您需要像这样显式地将dictionary
对象的类型指定为dictionary
let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as! [String: Any]
if let response = dictionary["response"] as? [String: Any],
let geoObjectCollection = response["GeoObjectCollection"] as? [String: Any],
let featureMember = geoObjectCollection["featureMember"] as? [[String: Any]] {
if let geoObject = featureMember[0]["GeoObject"] as? [String: Any],
let point = geoObject["Point"] as? [String: String] {
let latLongArray = point["pos"].components(separatedBy: " ")
let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]
}
}
您的JSON数据在Swift中具有以下类型:
[String: [String: [String: [[String: [String: [String: String]]]]]]]
我会避免使用这种嵌套太深的类型,但如果您敢使用它,您可以编写如下内容:
enum MyError: Error {
case invalidStructure
}
do {
guard let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as? [String: [String: [String: [[String: [String: [String: String]]]]]]] else {
throw MyError.invalidStructure
}
if let jsonCoordinatesString: String = dictionary["response"]?["GeoObjectCollection"]?["featureMember"]?[0]["GeoObject"]?["Point"]?["pos"] {
var latLongArray = jsonCoordinatesString.components(separatedBy: " ")
let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]
}
} catch let error {
print(error)
}
但您可能隐藏了JSON数据中一些不相关的成员,这可能会破坏这一转换
因此,您可以一步一步走,在某些情况下,在Swift 3中“需要”,如下所示:
do {
guard let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as? [String: AnyObject] else {
throw MyError.invalidStructure
}
if
let response = dictionary["response"] as? [String: AnyObject],
let geoObjectCollection = response["GeoObjectCollection"] as? [String: AnyObject],
let featureMember = geoObjectCollection["featureMember"] as? [[String: AnyObject]],
!featureMember.isEmpty,
let geoObject = featureMember[0]["GeoObject"] as? [String: AnyObject],
let point = geoObject["Point"] as? [String: AnyObject],
let jsonCoordinatesString = point["pos"] as? String
{
var latLongArray = jsonCoordinatesString.components(separatedBy: " ")
let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]
}
} catch let error {
print(error)
}
(
let
s对于Swift 3中的每个可选绑定都是必需的。如果愿意,您可以将所有AnyObject
s更改为Any
s。)您的JSON数据在Swift中具有以下类型:
[String: [String: [String: [[String: [String: [String: String]]]]]]]
我会避免使用这种嵌套太深的类型,但如果您敢使用它,您可以编写如下内容:
enum MyError: Error {
case invalidStructure
}
do {
guard let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as? [String: [String: [String: [[String: [String: [String: String]]]]]]] else {
throw MyError.invalidStructure
}
if let jsonCoordinatesString: String = dictionary["response"]?["GeoObjectCollection"]?["featureMember"]?[0]["GeoObject"]?["Point"]?["pos"] {
var latLongArray = jsonCoordinatesString.components(separatedBy: " ")
let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]
}
} catch let error {
print(error)
}
但您可能隐藏了JSON数据中一些不相关的成员,这可能会破坏这一转换
因此,您可以一步一步走,在某些情况下,在Swift 3中“需要”,如下所示:
do {
guard let dictionary = try JSONSerialization.jsonObject(with: geocodingResultsData as Data, options: .mutableContainers) as? [String: AnyObject] else {
throw MyError.invalidStructure
}
if
let response = dictionary["response"] as? [String: AnyObject],
let geoObjectCollection = response["GeoObjectCollection"] as? [String: AnyObject],
let featureMember = geoObjectCollection["featureMember"] as? [[String: AnyObject]],
!featureMember.isEmpty,
let geoObject = featureMember[0]["GeoObject"] as? [String: AnyObject],
let point = geoObject["Point"] as? [String: AnyObject],
let jsonCoordinatesString = point["pos"] as? String
{
var latLongArray = jsonCoordinatesString.components(separatedBy: " ")
let latitudeString = latLongArray[1]
let longitudeString = latLongArray[0]
}
} catch let error {
print(error)
}
(
let
s对于Swift 3中的每个可选绑定都是必需的。如果您愿意,您可以将所有AnyObject
s更改为Any
s。)可能重复我检查了主题@Larme,但对我的情况没有帮助,因此仍然不知道如何解决Swift 3/Xcode 8中的问题。如果我将dictionary强制转换为[AnyObject],我仍然会收到一个错误,即类型[AnyObject]没有下标成员。我已经检查了主题@Larme,但它对我没有帮助,因此仍然不知道如何解决Swift 3/Xcode 8中的问题。如果我将dictionary强制转换为[AnyObject],我仍然会收到一个错误,类型[AnyObject]没有下标成员。我尝试过这样做,但仍然收到类型“Any”没有下标成员,我尝试让dictionary=try JSONSerialization.jsonObject(数据为:geocodingResultsData,选项:.mutableContainers)为![String:Any]并让dictionary=尝试JSONSerialization.jsonObject(使用:geocodingResultsData作为数据,选项:.mutableContainers)作为![String:AnyObject]但在这两种情况下,get类型“Any”都没有下标。我尝试了这样做,但接收类型“Any”没有下标成员,我尝试了让dictionary=try JSONSerialization.jsonObject(使用:geocodingResultsData作为数据,选项:.mutableContainers)作为![String:Any]并让dictionary=try JSONSerialization.jsonObject(使用:geocodingResultsData作为数据,选项:.mutableContainers)作为![String:AnyObject],但在这两种情况下,get类型“Any”都没有下标eamber