在Swift中解析Gravatar Profile JSON

时间:2019-07-11 15:21:20

标签: json swift gravatar

我正在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而不使用更简化的根。我以前没看过。

1 个答案:

答案 0 :(得分:1)

entry键相关联的值只是具有一个元素的数组。在这种情况下,您可以访问json["entry"],将其强制转换为[[String: Any]]并访问第一个元素[0]。然后,您可以访问所需的内容,例如displayNameid

更好的方法是使用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,只需将其从结构中删除。