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

关于json - 在Swift中解析Gravatar Profile JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56992545/

10-12 12:38
查看更多