正在 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]。然后你可以访问你想要的东西,比如 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,只需将其从结构中删除即可。