我在iOS Swift应用程序中正确地加载了自己的配置文件信息,但是JSON有一个与之关联的对象,这让我很困惑如何正确地解析它以便访问其中的数据。这是我的方法。
func attemptToLoadProfile(hash: String) {
let url = "https://www.gravatar.com/\(hash).json"
let fileURL = URL(string: url)
do {
let contents = try String(contentsOf: fileURL!)
let data = contents.data(using: String.Encoding.utf8)
let json = try? JSONSerialization.jsonObject(with: data!, options: [])
print(json!)
} catch {
print("error parsing json")
}
}
这很好,但是当我打印出来时,JSON的格式是这样的。
{
entry = (
{
displayName = edolecki;
hash = <myhash here>;
id = 1333520;
name = {
familyName = Dolecki;
formatted = "Eric Dolecki";
givenName = Eric;
};
photos = (
{
type = thumbnail;
value = "https://secure.gravatar.com/avatar/<myhash here>";
}
);
preferredUsername = edolecki;
profileUrl = "http://gravatar.com/edolecki";
requestHash = <myhash here>;
thumbnailUrl = "https://secure.gravatar.com/avatar/<myhash here>";
urls = (
);
}
);
}
如果在根目录中有entry对象,如何解析JSON?我关注的是displayName、id等,通常解析JSON时没有更简单的根。我以前没见过这个。
最佳答案
与entry
键关联的值只是一个包含一个元素的数组。在这种情况下,您可以访问json["entry"]
,将其转换为[[String: Any]]
并访问第一个元素[0]
。然后你可以访问你想要的东西,比如displayName
和id
。
更好的方法是使用Codable
。使用QuickType,我生成了以下代码:
struct Root: Codable {
let entry: [Entry]
}
struct Entry: Codable {
let id, hash, requestHash: String
let profileURL: URL
let preferredUsername: String
let thumbnailURL: URL
let photos: [Photo]
let displayName: String
enum CodingKeys: String, CodingKey {
case id, hash, requestHash
case profileURL = "profileUrl"
case preferredUsername
case thumbnailURL = "thumbnailUrl"
case photos, displayName
}
}
struct Photo: Codable {
let value: URL
let type: String
}
然后可以执行此操作来解析json:
let decoder = JSONDecoder()
let root = try decoder.decode(Root.self, from: data)
// e.g.
let displayName = root.entry[0].displayName
如果不需要任何json kvp,只需将其从结构中移除。
关于json - 在Swift中解析Gravatar Profile JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56992545/