Разбор профиля Gravatar JSON в Swift - PullRequest
1 голос
/ 11 июля 2019

Я правильно загружаю информацию о своем профиле в приложение 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 Ответ

1 голос
/ 11 июля 2019

Значение, связанное с ключом 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, просто удалите его из структуры.

...