我正在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而不使用更简化的根。我以前没看过。
答案 0 :(得分:1)
与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,只需将其从结构中删除。