首页
学习
活动
专区
圈层
工具
发布

解析Wiki
EN

Stack Overflow用户
提问于 2022-01-18 03:52:58
回答 3查看 52关注 0票数 0

我是Swift的新手,我正在努力弄清楚如何解析附近的Wiki返回的JSON。在https://www.youtube.com/watch?v=sqo844saoC4的帮助下,我现在的处境如下:

代码语言:javascript
复制
import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let url = "https://en.wikipedia.org/w/api.php?action=query&list=geosearch&gscoord=37.7891838%7C-122.4033522&gsradius=10000&gslimit=2&format=json"
        getData(from: url)
        
        
    }
    
    private func getData(from url: String) {
        
        let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: {data, response, error in
            
            guard let data = data, error == nil else {
                print("Something went wrong")
                return
            }

            
            var result: Response?
            do {
                result = try JSONDecoder().decode(Response.self, from: data)
            }
            catch {
                print("failed to convert \(error.localizedDescription) ")
            }
            
            guard let json = result else {
                return
            }
            
            print(type(of: json.query.geosearch))
            print(json.query.geosearch.self)
            
            
        })
        task.resume()
    }
    
    
}



struct Response: Codable {
    let batchcomplete: String
    let query: Query
}

struct Query: Codable {
    let geosearch: [Geosearch]?
}

struct Geosearch: Codable {
    
    let pageid: Int?
    let title: String?
}

遵循Need help parsing wikipedia json api in SWIFT,我相信地理搜索是一本字典。代码运行,但是如何从地理搜索检索标题或页面(打印(json.query.geosearch.title)给出一个错误)?

抱歉-可能是一些很基本的东西.如有任何指示,将不胜感激。

菲利普

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-01-18 04:24:24

试试下面的代码。它使用一个完成闭包来“等待”,直到在返回结果之前获取结果。因为geosearch是一个数组,所以您需要遍历它。注意,分析json响应时没有出现错误。为我工作。

代码语言:javascript
复制
class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let url = "https://en.wikipedia.org/w/api.php?action=query&list=geosearch&gscoord=37.7891838%7C-122.4033522&gsradius=10000&gslimit=2&format=json"
        
        getData(from: url) { response in
            if let result = response,
               let geosearch = result.query.geosearch {
                print("-----> result: \(result) \n")
                for geo in geosearch {
                    print("geo.title: \(geo.title)")
                }
            }
        }
    }
    
   func getData(from url: String, completion: @escaping(Response?) -> ()) {
    if let theURL = URL(string: url) {
        let task = URLSession.shared.dataTask(with: theURL) { data, response, error in
            guard let data = data, error == nil else {
                print("Something went wrong")
                completion(nil)
                return
            }
            do {
                let result = try JSONDecoder().decode(Response.self, from: data)
                completion(result)
            } catch {
                print("failed to convert \(error) ")
                completion(nil)
            }
        }
        task.resume()
    }
}
    
}
票数 0
EN

Stack Overflow用户

发布于 2022-01-18 04:04:32

您需要访问数组项才能获得页面或标题,如下所示:

代码语言:javascript
复制
print(json.query.geosearch?[0].title ?? "")

因为json返回一个数组

代码语言:javascript
复制
{
  "batchcomplete": "",
  "query": {
    "geosearch": [
      {
        "pageid": 18618509,
        "ns": 0,
        "title": "Wikimedia Foundation",
        "lat": 37.78916666666667,
        "lon": -122.40333333333334,
        "dist": 2.5,
        "primary": ""
      },
      {
        "pageid": 42936625,
        "ns": 0,
        "title": "Foxcroft Building",
        "lat": 37.78916666666667,
        "lon": -122.40333333333334,
        "dist": 2.5,
        "primary": ""
      }
    ]
  }
}
票数 0
EN

Stack Overflow用户

发布于 2022-01-18 04:30:08

代码语言:javascript
复制
print(json.query.geosearch.self) //This will store the repsone in the let geosearch: [Geosearch]?


//You can check the individual result for the 1st and 2nd object 
print(json.query.geosearch[0].pageid)//18618509
print(json.query.geosearch[0].title) //"Wikimedia Foundation"

print(json.query.geosearch[1].pageid)//42936625
print(json.query.geosearch[1].title) //"Foxcroft Building"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70750099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档