【问题标题】:Accessing Dictionary within object within dictionary in Swift在Swift中的字典内访问对象内的字典
【发布时间】:2015-10-24 18:35:36
【问题描述】:

我正在使用 Yellow Pages API 根据手机的位置访问企业列表。结果以 JSON 格式返回,我正在成功解析:

    do {
         let searchResultsData = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

    print(searchResultsData)
.
.
.

结果是一个字典,其中包含其他字典和对象的混乱层次结构。

这是主要字典内容的控制台打印输出:

{
    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。任何有关如何深入了解此字典结构的建议将不胜感激。谢谢。

【问题讨论】:

    标签: ios json swift dictionary


    【解决方案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数据对象仍然没有告诉你它包含什么,但至少你不需要每次都检查。

    【讨论】:

    • 我在尝试解决这个问题时遇到了 SwiftyJSON 的提及。我会再调查一下,谢谢你的回复。
    【解决方案2】:

    我创建了这个在线实用程序 (http://www.json4swift.com),它可以将您的 json 转换为快速可表示的模型,您可以轻松地深入研究结构。您需要做的就是粘贴您的 Json 并将生成的模型复制到您的项目中,然后像这样使用它:

        //Create instance for base model representation
        let responseModel = Json4Swift_Base(dictionary: searchResultsData)
    

    然后您的响应模型将成为您的字典的基于对象的表示

    【讨论】:

    • 如何从模型类访问数据
    猜你喜欢
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多