正在 Swift 中解析 Gravatar 配置文件 JSON
Parsing Gravatar Profile JSON in Swift
我在 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 = (
);
}
);
}
如何解析 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,只需将其从结构中删除即可。
我在 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 = (
);
}
);
}
如何解析 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,只需将其从结构中删除即可。