[英]Accessing Dictionary within object within dictionary in Swift
我正在使用Yellow Pages API根据电话的位置访问商家信息。 结果以JSON返回,并且我正在成功解析它:
do {
let searchResultsData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary
print(searchResultsData)
.
.
.
结果是一个Dictionary,其中包含其他词典和对象的混乱层次。
这是主要词典内容的控制台打印输出:
{
searchResult = {
metaProperties = {
didYouMean = "";
errorCode = "";
inputParams = {
"@xsi.type" = searchRequest;
appId = xxxxxxxx;
dnt = "";
format = json;
listingCount = 2;
phoneSearch = 0;
radius = 5;
requestId = "a75efeb9-de0a-4411-8ee9-c6c43f3867e8";
searchLocation = "37.33233141:-122.0312186";
shortUrl = 0;
sort = distance;
term = pizza;
termType = "";
test = "";
userAgent = "Determine%20use%20location/1 CFNetwork/758.1.6 Darwin/14.5.0";
userIpAddress = "22.1.2.33";
userReferrer = internalReferrer;
visitorId = xxxxxxxxxx;
};
listingCount = 2;
message = "";
relatedCategories = {
"@xsi.type" = rServiceFacets;
relatedCategory = (
{
count = 121;
name = Pizza;
},
{
count = 105;
name = Restaurants;
},
{
count = 78;
name = "Take Out Restaurants";
},
{
count = 41;
name = "Italian Restaurants";
},
{
count = 30;
name = Caterers;
}
);
};
requestId = "a75efeb9-de0a-4411-8ee9-c6c43f3867e8";
resultCode = Success;
searchCity = Cupertino;
searchLat = "37.323056";
searchLon = "-122.031111";
searchState = CA;
searchType = Category;
searchZip = 95015;
totalAvailable = 121;
trackingRequestURL = "http://c.ypcdn.com/2/i/rtd?vrid=gpnx7mtbzw&rid=a75efeb9-de0a-4411-8ee9-c6c43f3867e8&ptid=gpnx7mtbzw&lsrc=MDM&cp=__";
ypcAttribution = "";
};
searchListings = {
searchListing = (
{
adImage = "";
adImageClick = "";
additionalText = " ";
audioURL = "";
averageRating = "2.86";
baseClickURL = "http://c.ypcdn.com/2/c/rtd?vrid=gpnx7mtbzw&rid=a75efeb9-de0a-4411-8ee9-c6c43f3867e8&ptid=gpnx7mtbzw&ypid=17510978&lid=17510978&lsrc=MDM";
businessName = "BJ's Restaurants";
businessNameURL = "http://c.ypcdn.com/2/c/rtd?vrid=gpnx7mtbzw&rid=a75efeb9-de0a-4411-8ee9-c6c43f3867e8&ptid=gpnx7mtbzw&ypid=17510978&lid=17510978&tl=1600&lsrc=MDM&dest=http%3A%2F%2Fwww.yellowpages.com%2Fcupertino-ca%2Fmip%2Fbjs-restaurants-17510978%3Ffrom%3Dpubapi_gpnx7mtbzw";
categories = " Restaurants|Take Out Restaurants|Brew Pubs|American Restaurants|Pizza|Family Style Restaurants|Beer & Ale|";
city = Cupertino;
claimed = 0;
claimedStatus = 0;
// removed for space
},
{
// removed for space
// second listing follows same structure
}
);
};
};
}
为了节省空间,我删除了第一个清单的大部分内容和第二个清单的所有内容。 列表结构是一致的。 可以通过API参数控制返回的列表数量。
如您所见,主字典中的第一项是另一个名为searchResult的字典。 我可以通过以下方式成功访问它:
let dataReturned = searchResultsData["searchResult"]!
但是,这就是我遇到的问题。 变量视图显示dataReturned的类型为NSDictionary,但随后显示其中包含和NSMutableDictionary,其中包含一个NSDictionary,其中包含一个NSObject,该对象包含或命名为NSDictionary类型的“ isa”,具有2个键值对,其中之一是我所使用的键感兴趣的,名为searchListings。
我进行了无数次搜索,并尝试了进一步钻取的方法,但是不断出现错误,这些错误基本上都归结为无法通过dataReturned和我感兴趣的key:values之间的对象。
如果您在此处看到屏幕截图,那么这个问题就更有意义了: http : //screencast.com/t/VozRgLEzriD
我正在使用Xcode 7.1。 任何有关如何深入研究此字典结构的建议将不胜感激。 谢谢。
您遇到了问题,因为您获得的字典并没有告诉您有关它包含的内容的任何信息。 您将必须执行以下操作:
if let
searchRes = searchResultsData["searchResult"] as? [NSObject : AnyObject],
listings = searchRes["searchListings"] as? [NSObject : AnyObject],
.... {
// here is your code
}
但这确实很麻烦。 有一个很好的选择: SwiftyJSON 。 它启用了这样的模式(示例取自SwiftyJSON):
let json = JSON(data: data)
if let userName = json[0]["user"]["name"].string {
//Now you got your value
}
json数据对象仍然不会告诉您它包含的内容,但是至少您不需要每次都进行检查。
我创建了此在线实用程序( http://www.json4swift.com ),该实用程序将json转换为快速可表示的模型,您可以轻松地向下钻取到该结构。 您需要做的就是粘贴您的Json并将生成的模型复制到您的项目中,然后像这样使用它:
//Create instance for base model representation
let responseModel = Json4Swift_Base(dictionary: searchResultsData)
然后您的响应模型成为字典的基于对象的表示形式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.